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

createh53个月前 (02-13)技术教程26

本篇文章主要介绍几种合并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λ能提高可读性。

相关文章

挥别代码拼接累,一键生成完整工程代码

在 Java 开发领域,传统的新增接口开发往往伴随着繁琐的代码拼接工作,犹如在荆棘丛中艰难前行,令众多开发者疲惫不堪。从细致入微的接口设计,到严谨复杂的表结构规划,从精准的业务规则编写,再到繁琐的数据...

告别繁琐代码拼接,一键完成新增接口开发

在 Java 开发的世界里,你是否还在为新增接口而苦恼?传统的开发方式,需要开发者花费大量时间在代码拼接上,从接口设计到表结构设计,从业务规则实现到数据处理流程,每一个环节都需要精心打磨,繁琐且容易出...

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

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

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

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

SpringBoot整合Redis步骤,手把手教你一步步实现

前言:关于Spring的知识点总结了一个思维导图分享给大家:一、Maven依赖(1)本文所采用的SpringBoot的版本如下:1 2 org.springframework.boot 3 spri...

外部工具连接 SaaS 模式云数据仓库 MaxCompute 实战

本次分享将从四个方面讲解。01 走进 MaxCompute 生态02 商业智能(BI)分析工具概览03 JDBC 简介04 实操展示——快速接入 FineBI下面开始我们第一部分的分享一、走进 Max...