Java 8 引入了Stream API,它提供了一种新的处理数据的方式,允许以声明式风格对集合进行操作。Stream API 支持函数式编程,可以写出更简洁、更高效的代码。
什么是Stream
Stream是Java 8中一个来自Optional的接口,可以在任何对象的集合上进行一系列操作,包括中间操作(例如filter、map等)和终结操作(例如forEach、reduce等)。Stream API不会修改原始的数据集合,而是返回一个新的数据集合。
如何创建Stream
可以通过多种方式创建Stream对象:
- 从集合或数组:使用
Collection.stream()
或Arrays.stream()
方法。 - 使用Stream.of()`:创建一个包含指定元素的Stream。
- 创建无限流:使用
Stream.iterate()
或Stream.generate()
。
Stream的操作
中间操作
中间操作是从一个Stream开始,对其数据进行某种处理,然后返回一个新的Stream,以便可以进行进一步的处理。
filter
:过滤出满足条件的元素。map
:将每个元素映射到另一个元素。limit
:限制流中元素的数量。sorted
:对流中的元素进行排序。
结束操作
结束操作会消耗Stream,并产生一个最终的结果或副作用。
forEach
:对流中的每个元素执行操作。reduce
:通过某个连接动作将所有元素汇总成一个汇总结果。collect
:将流转换为其他形式(例如集合)。allMatch
、anyMatch
、noneMatch
:检查流中的元素是否与给定的谓词匹配。
示例
过滤和映射
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
long count = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.count();
System.out.println(count); // 输出 1
归约
int sum = Arrays.stream(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
.reduce(0, Integer::sum);
System.out.println(sum); // 输出 55
收集
Map<String, List<String>> peopleByCity = people.stream()
.collect(Collectors.groupingBy(Person::getCity));
并行Stream
Java 8也支持并行Stream,可以利用多核处理器的计算能力来加速大集合的处理。
long count = names.parallelStream()
.filter(name -> name.startsWith("A"))
.count();
注意事项
- Stream API是懒加载的,这意味着直到需要结果时,中间操作不会执行。
- 每个Stream只能使用一次,一旦执行了结束操作,Stream就不能再次使用了。
- 过度使用Stream API可能会导致性能下降,尤其是在小数据集上。
结语
Java 8的Stream API为集合操作提供了一种新的方式,它使得代码更加简洁、易读。通过函数式编程,可以以声明式风格对数据集合进行复杂的操作。理解并熟练使用Stream API,对于Java开发者来说是一项重要的技能。
这篇文章介绍了Java 8 Stream API的基本概念、创建方式、操作类型以及一些使用示例,适合Java初学者和希望提高代码效率的开发者。