Java 8引入了很多新的特性,其中最重要的之一就是Stream API。Stream API为Java集合框架提供了一种函数式编程风格的处理数据的方式,使得代码更简洁、可读性更强。
什么是Stream?
Stream是一个来自数据源的元素队列,可以支持多种操作。数据源可以是集合、数组、I/O channel、generator等。Stream操作可以是中间操作,也可以是终端操作。中间操作会返回一个新的Stream对象,可以进行进一步的操作;终端操作会返回void或指定类型的结果。
Stream的特性
- Pipelining: 中间操作可以串联,形成一个管道,对数据进行连续操作。
- 内部迭代:与传统的集合迭代方式不同,Stream API利用内部迭代方式,使得并行处理数据更加容易。
- 支持惰性求值:Stream操作只有在需要结果的时候才执行,不需要一次处理整个数据集。
- 可消费性:Stream只能被消费一次,一旦遍历过就不能再次遍历。
Stream的操作
Stream操作可以分为两种类型:中间操作和终端操作。
中间操作
中间操作是指返回Stream对象的操作,可以进行连续的操作。常用的中间操作包括filter、map、limit、sorted等。
- filter:根据指定条件过滤元素
- map:对每个元素进行映射操作,返回一个新的Stream对象
- limit:限制Stream的大小,返回一个截断后的Stream对象
- sorted:对元素进行排序操作
以下是一个例子,通过使用filter和map中间操作,从一个整数集合中筛选出所有的偶数并进行加倍操作。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbersDoubled = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.collect(Collectors.toList());
System.out.println(evenNumbersDoubled); // 输出结果: [4, 8, 12, 16, 20]
终端操作
终端操作是指返回非Stream对象的操作,可以产生一个最终结果或者一个副作用。常用的终端操作包括collect、forEach、reduce、count等。
- collect:将Stream对象转换为其他集合类型,如List、Set等
- forEach:对Stream中的每个元素进行操作
- reduce:对Stream中的元素进行归约操作,返回一个值
- count:返回Stream中的元素个数
以下是一个例子,通过使用collect终端操作,将Stream中的元素转换为一个List对象。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> numberList = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(numberList); // 输出结果: [2, 4, 6, 8, 10]
总结
Stream API是Java 8中引入的一个强大的特性,它使得处理集合数据更加简洁、可读性更强。通过使用Stream的中间操作和终端操作,我们可以很方便地对数据进行筛选、映射、排序等操作,同时还支持惰性求值和并行处理等特性。
希望本博客对理解Java 8的Stream API有所帮助,如果对Stream API还有疑问或者有更多的应用场景,请留言讨论。
本文来自极简博客,作者:星空下的约定,转载请注明原文链接:Java 8的新特性:Stream API