「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」。
前言
Hello 大家好,我是l拉不拉米
,流式计算
一直是Java面试中出现频率很高的一个问题,今天『面试の神』系列就来讲一讲 Java 流合并的实现方式。
普通Java方法
JDK 8 Stream 类有一些有用的静态方法。比如concat()
:
合并两个流
1 | java复制代码@Test |
合并多个流
当我们要合并多个流时,操作会变得复杂一些。一个可行的办法是,先合并前两个流,再用合并结果合并其他的流。
比如:
1 | java复制代码@Test |
这种方法对于更多的流变得不可行。当然,我们可以创建中间变量或辅助方法以使其更具可读性,但我们还有更好的办法:
1 | java复制代码@Test |
它经过两个步骤:
- 首先创建一个包含 4 个 Streams 的新 Stream,生成嵌套的流 Stream
- 然后我们使用恒等函数将它
flatMap()
转换为 Stream
使用 StreamEx
StreamEx 是一个开源 Java 库,它扩展了 Java 8 Streams 的可能性。它使用 StreamEx 类作为对 JDK 的 Stream 接口的增强。
合并流
StreamEx 库允许我们使用 append()
实例方法合并流:
1 | java复制代码@Test |
由于它是一个实例方法,我们可以轻松地将它链接起来并附加多个 streams。
使用prepend()合并流
StreamEx 还包含一个方法,该方法在另一个之前添加元素,称为 prepend()
:
1 | java复制代码@Test |
使用Jooλ
jooλ是JDK 8兼容库,可为JDK提供有用的扩展。此处最重要的流抽象称为 SEQ
。请注意,这是一个顺序和有序的流,因此调用 parallel() 将没有效果。
合并流
和StreamEx库一样,jooλ也有append()
方法:
1 | java复制代码@Test |
使用prepend()合并流
1 | java复制代码@Test |
总结
可以看出来合并两个流的时候使用 JDK 8 比较简单方便,但当我们需要多个流合并时,使用SteamEx或JOOλ库可以通过append()
的方式追加流,可读性更高。
本文转载自: 掘金