连接两个流的 NullSafe 方法是什么?

Jis*_*hap 4 java java-8 java-stream

我有两个整数流来宾TravelWith 和来宾,当流中的任何一个为 Null 时,我正在连接它们但抛出错误。是否有连接两个流的 nullsafe 方法?或者使用 if 条件是我唯一的希望?

Stream<Integer> guests = code+some_method();
Stream<Integer> guestsTravelWith = code+some_method();
Stream.concat(guestsTravelWith, guests)
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 9

一点都不好看,但是:

Stream.ofNullable(guestsTravelWith).orElse(Stream.empty()).flatMap(Function.identity())
Run Code Online (Sandbox Code Playgroud)

或者你知道,“不那么有趣”的方式:

guests == null ? Stream.empty() : guests;
Run Code Online (Sandbox Code Playgroud)

您应该重新考虑返回nullStream的方法,这是一个糟糕的主意。

  • 即使您决定用更复杂的构造替换直接的三元运算符,您也可以选择直接替换,`Optional.ofNullable(guestsTravelWith).orElse(Stream.empty())`(或 `orElseGet (Stream::empty)`),或者更复杂的结构,比如 `Stream.ofNullable(guestTravelWith).orElse(Stream.empty()).flatMap(Function.identity())`...顺便说一下,`Stream. ofNullable(...)` 在 Java 8 中不可用。当你使用 Java 9 或更新版本时,`Objects.requireNonNullElse(guests, Stream.empty())` 甚至比使用 `Optional` 更好。 (2认同)

Ale*_*nko 6

为什么不只是过滤掉null流?

Stream<Integer> s1 = null;
Stream<Integer> s2 = Stream.of(1, 2, null, 4);
    
Stream.of(s1, s2)
      .filter(Objects::nonNull) // Stream<Stream>
      .flatMap(s -> s) // or Function.identity()
      .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

霍尔格评论的更新
Stream.concat应替换为Stream.ofnull-safe Stream::flatMap

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
返回一个流,该流由通过将提供的映射函数应用于每个元素而生成的映射流的内容替换此流的每个元素的结果组成。每个映射流在其内容放入该流后关闭。(如果映射流为空,则使用空流代替。)

    Stream<Integer> s1 = null;
    Stream<Integer> s2 = Stream.of(1, 2, null, 4);

    Stream.of(s1, s2)
          .flatMap(s -> s) // or Function.identity()
          .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
null
4
Run Code Online (Sandbox Code Playgroud)