Java 8 引入的 Stream API 是一个高级工具,用于在集合上执行复杂的数据处理查询。Stream API 通过提供一系列的中间操作和最终操作,支持声明式处理(类似于SQL声明式语句)并且可以轻松使用多核架构。
创建Stream流
创建Stream 流的方式有多中,我们可以从集合或者数组中进行创建
collection.stream() 或 Arrays.stream(array)
或者从静态工厂中进行创建:
Stream.of(), IntStream.range()
同样也可以从文件中生成流:
Files.lines(Path path)
对流进行操作
我们对流进行操作之后并不会产生最终结果,通常来说是懒加载的,并且可以链式调用。
- filter操作:设置一定的操作对Stream中所有的元素进行过滤
- map操作:转换元素
- sorted操作:对流中的数据进行排序
- limit操作:限制流中的元素数据数量
- ditinct操作:去除重复元素
最终操作
经过这些最终操作之后,不能再对流进行操作。一些常见的最终操作包括:
- forEach:遍历每一个元素
- collect:将流转换成不同类型的结果
- reduce:通过某个二元操作合并流中的元素
- count操作:返回流中元素的个数
简单示例
List<String> myList = Arrays.asList("apple", "banana", "cherry", "date");List<String> filtered = myList.stream().filter(s -> s.startsWith("a")) // 中间操作:过滤以"a"开头的字符串.map(String::toUpperCase) // 中间操作:转换成大写.collect(Collectors.toList()); // 最终操作:收集到List中filtered.forEach(System.out::println); // 输出过滤后的列表
注意
需要注意的一点是 Stream一旦执行了最终操作,就会被消耗掉,也就无法再次使用,如果我们需要再次使用相同的数据源,就需要重新创建一个新的Stream。另外,Stream的操作一般不会改变原始的数据源,通常是会产生一个新的数据集。