Stream
如果说 Lambda 对于 Java 是语法上的一个改进,那么 Stream 就是对于 Java 容器集合的改进。
Stream 流是一个值序列的抽象,它位于 java.util.stream 包下,它代表着一系列的值,它和 Java 集合容器具有一些相同的特性,但是它们有着本质的不同。
集合容器是存储值的,而流是一个值的视图,它不存储值,它是值的一组镜像。
集合是有限的,而流可以是有限的也可以是无限的。
流提供了许多方便的聚集操作,而且有可能是并行的聚集,比集合容器来说一些情况下会具有更高的性能。
可以看到对于一个集合 List 来说,它可以通过调用自己的 stream 方法获得自己的流视图,然后就可以对流视图进行聚集操作了。而且这里我们也可以通过代码看到使用了 Lambda 在组合 Stream 之后对于集合容器的操作在一定程度上是可以更加简洁优雅的,这里用一行代码就打印出了所有大于10的偶数。
对于大部分的 Java 集合框架都提供了获取自己流视图的 stream 方法,而对于数组等在 Arrays 工具类中也提供了获取其流视图的方法。
而一旦拿到了一个流视图就代表着我们可以完全的使用函数式编程的方式来对这个流视图进行操作,而对于流的大部分操作都会返回一个流,而部分操作则是终结操作,它会返回一个最终的结果。
可以看到只要合理的使用流视图和方法引用,我们的代码将会变的更加的简单优雅。
映射操作是 Stream 中比较有意思的一个操作。
map 映射可以对流进行一种一对一的映射,结果也很简单就不多说了。
而对于流来说,其内嵌的方法非常之多,基本上可以满足我们大部分的需要,在配合上 Lambda 表达式更是如虎添翼。而对剩下的 Stream Api 我们这里就不在细细分析了,各位可以自行查看 API 文档。
Collect
前部分我们简单的探讨了如何获取一个流,而我们说过一个流其实是一个值的镜像,而当我们做完过滤排序等操作之后,我们很自然的会需要把这个结果存储起来,那么这里就涉及到了一个收集流的过程。
收集流的过程很简单,流提供了一个终结操作 collect,它会按照其内部的一个 Collector 来收集流,而 Collectors 类提供了很多内嵌的 Collector 实现,我们简单的使用即可。
而 groupingBy / mapping 等都是很有意思的收集器实现,各位可以根据自己的喜好挑选自己喜欢的收集器。
parallelStream
parallelStream 是 stream 的兄弟函数,它返回一个并行的流,与串行流不同的是并行流支持并行操作,但是这需要实现的支持,但是经过测试使用并行流居然比使用串行流更慢,可能是我姿势有误,至于并行流就不再做深入讨论了,它的使用方式和串行流一样。
无限流
大部分时候我们都会使用有限流来完成操作,但是有时候我们又会需要使用到无限流,比如说求从1开始的30个完全数,它完全可以抽象为一个无限流的操作。
而 Stream 本身也有几个方法可以生成流。
本系列到此结束。