美文网首页技术干货Java
【Java必修课】Java 8之例说Stream的合并

【Java必修课】Java 8之例说Stream的合并

作者: 南瓜慢说 | 来源:发表于2019-10-09 23:19 被阅读0次

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

    原生JDK

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

    concat()合并两个Stream

    Stream<Integer> stream1 = Stream.of(1, 2, 3);
    Stream<Integer> stream2 = Stream.of(4, 5);
    Stream<Integer> 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<Integer> 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引入:

    <dependency>
        <groupId>one.util</groupId>
        <artifactId>streamex</artifactId>
        <version>0.7.0</version>
    </dependency>
    

    使用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<String> streamA = Stream.of("[");
    Stream<String> streamB = Stream.of("google", "apple");
    Stream<String> streamC = Stream.of("]");
    Stream<String> resultStream = StreamEx.of(streamB)
            .prepend(streamA)
            .append(streamC);
    assertEquals(
            asList("[", "google", "apple", "]"),
            resultStream.collect(Collectors.toList()));
    

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

    使用Jooλ

    Mavan引入:

    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jool-java-8</artifactId>
        <version>0.9.13</version>
    </dependency>
    

    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 8之例说Stream的合并

        本文链接:https://www.haomeiwen.com/subject/mbvnpctx.html