Java中的Stream API是Java 8中引入的一个重要的新特性,它提供了一种在集合(如List、Set等)上进行复杂操作的高效且易读的方式。Stream API可以极大地提高Java程序员对集合数据进行操作的能力,尤其是处理大量数据时。它支持顺序和并行处理。
Stream API的基本概念
- Stream:Stream代表数据序列,可以被操作和处理。
- Stream Source:如集合(Collection)、数组(Array)等,是Stream的源数据。
- Intermediate Operations:中间操作,如
filter
、map
、sorted
等,返回一个新的Stream,可以有零个或多个。 - Terminal Operations:终端操作,如
forEach
、collect
、reduce
、sum
等,返回一个结果或者一个副作用(比如修改原来的数据源)。
Stream API的操作
中间操作
- filter:过滤Stream中的数据,返回符合特定条件的数据。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
2.map:转换每个元素到对应的结果类型。
List<String> words = Arrays.asList("hello", "world"); List<Integer> wordLengths = words.stream().map(String::length).collect(Collectors.toList());
3.sorted:对Stream进行排序。
List<Integer> sortedNumbers = numbers.stream().sorted().collect(Collectors.toList());
终端操作
- forEach:遍历每个元素。
numbers.stream().forEach(System.out::println);
collect:将Stream转换为其他形式,如List、Map等。
List<Integer> collectedNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
reduce:将Stream元素组合成一个单一的值。
Integer sum = numbers.stream().reduce(0, Integer::sum);
sum:计算Stream中所有元素的总和。
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
并行Streams
Stream API也支持并行处理,通过将一个串行Stream转换为并行Stream可以显著提高处理大量数据时的性能。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int sum = numbers.parallelStream().reduce(0, Integer::sum);
总结
Java的Stream API代表了现代编程语言中函数式编程范式的一种实现,它提供了一种声明式的方式来处理集合数据,让代码更加简洁、易读,并且可以利用现代多核处理器的优势进行并行计算。它广泛应用于数据分析、处理大量数据场景,是现代Java开发不可或缺的一部分。