「Java必修课」Java 8之例说Stream的合并

createh54周前 (02-13)技术教程17

本篇文章主要介绍几种合并stream的方法,主要有原生JDK的方法和使用第三方库StreamEx和Jooλ的方法。

原生JDK

原生的JDK 8提供的Stream里的一些静态方法,非常有用,让我们来了解一下吧。

concat()合并两个Stream


Stream stream1 = Stream.of(1, 2, 3);
Stream stream2 = Stream.of(4, 5);
Stream result = Stream.concat(stream1, stream2);
assertEquals(
 asList(1, 2, 3, 4, 5),
 result.collect(Collectors.toList())
);

这是最简单的合并两个流的方式。

用Stream.of()合并多个流

之前的concat()方法并不支持合并多个stream,这时需要用到of(),可以实现多个stream的合并。


stream1 = Stream.of(1, 2, 3);
stream2 = Stream.of(4, 5);
Stream stream3 = Stream.of(6, 7, 8);
result = Stream.of(stream1, stream2, stream3)
 .flatMap(i -> i);
assertEquals(
 asList(1, 2, 3, 4, 5, 6, 7, 8),
 result.collect(Collectors.toList()));


使用StreamEx

StreamEx是开源的Java库,扩展了Java 8 Streams的更多可能性。

Maven引入:



 one.util
 streamex
 0.7.0

使用append()合并


stream1 = Stream.of(1, 2, 3);
stream2 = Stream.of(4, 5);
stream3 = Stream.of(6, 7, 8);
result = StreamEx.of(stream1)
 .append(stream2)
 .append(stream3);
assertEquals(
 asList(1, 2, 3, 4, 5, 6, 7, 8),
 result.collect(Collectors.toList()));

这样我们就可以动态不断合并流。

使用prepend()合并


Stream streamA = Stream.of("[");
Stream streamB = Stream.of("google", "apple");
Stream streamC = Stream.of("]");
Stream resultStream = StreamEx.of(streamB)
 .prepend(streamA)
 .append(streamC);
assertEquals(
 asList("[", "google", "apple", "]"),
 resultStream.collect(Collectors.toList()));

使用prepend()能明显地知道前后顺序。

使用Jooλ

Mavan引入:



 org.jooq
 jool-java-8
 0.9.13

Jooλ和StreamEx很类似,也有对应的append()和prepend()方法。


stream1 = Stream.of(1, 2, 3);
stream2 = Stream.of(4, 5);
result = Seq.ofType(stream1, Integer.class)
 .append(stream2);
assertEquals(
 asList(1, 2, 3, 4, 5),
 result.collect(Collectors.toList()));
/*--------------*/
streamA = Stream.of("[");
streamB = Stream.of("google", "apple");
streamC = Stream.of("]");
resultStream = Seq.ofType(streamB, String.class)
 .prepend(streamA)
 .append(streamC);
assertEquals(
 asList("[", "google", "apple", "]"),
 resultStream.collect(Collectors.toList()));


总结

如果用得不多,JDK足以应付;如果经常使用,场景也比较多,用StreamEx和Jooλ能提高可读性。

相关文章

45 个 Git 经典操作场景,专治不会合代码

文章转载于:江南一点雨git 对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一...

别了,代码拼接苦,一键完成接口开发

曾经,Java 开发的世界里,新增接口就像一场漫长的苦役。开发者们对着空白文档,眉头紧皱,苦思冥想接口的各种细节,然后就开始了那令人抓狂的代码拼接之旅。就好比你要搭建一座超级复杂的乐高城堡,可每一块积...

我的世界服务器开服Java版连接教程

本文摘抄莱卡云游戏服务器我的世界教程本教程使用Paper核心开服1、进入控制面板登录面板的信息在绿色的登陆面板按键下方,不是你的莱卡云账号1.2、第一次购买服务器会安装游戏端,大约5分钟左右,如果长时...

Java与Kotlin使用体验深度对比与心得

在软件开发领域,编程语言的选择对项目的开发效率、代码质量以及可维护性等方面有着深远影响。Java作为一款经典的编程语言,凭借其强大的生态系统、平台无关性和广泛的应用场景,长期占据着重要地位。而Kotl...

深入理解Java类加载机制-连接_java 类加载的过程

在接触了类加载的基本知识以后,我们已经清楚了类加载大体分为3个阶段:加载连接初始化今天我们主要讲解类加载的第二个阶段-连接阶段。连接阶段又可以分为三个部分:验证准备解析验证由于我们的字节码来源多样化,...