【问题标题】:What is NullSafe way to concatenate two Streams?连接两个流的 NullSafe 方法是什么?
【发布时间】:2021-08-24 19:18:02
【问题描述】:

我有两个整数流 guestTravelWith 和guests,我将它们连接起来,但是当任何一个流为空时抛出错误。有没有一种空安全的方法来连接两个流?还是使用 if 条件是我唯一的希望?

Stream<Integer> guests = code+some_method();
Stream<Integer> guestsTravelWith = code+some_method();
Stream.concat(guestsTravelWith, guests)

【问题讨论】:

  • 您使用的是哪个 Java 版本?
  • Stream.ofNullable(guestsTravelWith).orElse(Stream.empty()).flatMap(Function.identity())?
  • 返回 Streams 的方法返回 null 而不是空流,这是一个相当严重的设计缺陷。
  • @LouisWasserman 除非您也许想要指出没有结果。在这种情况下,Optional 应该是首选。无论如何,尝试使用可以是nullStream 是一个缺陷。如果null用于表示缺席,必须立即检查并回复。

标签: java java-8 java-stream


【解决方案1】:

一点都不好,但是:

Stream.ofNullable(guestsTravelWith).orElse(Stream.empty()).flatMap(Function.identity())

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

guests == null ? Stream.empty() : guests;

您应该重新考虑返回 null Stream 的方法,这是一个糟糕的想法。

【讨论】:

  • 最后一句话很重要。为什么在用 null 打破逻辑时使用流?
  • 你认为这个stackoverflow.com/a/68913438/3651739 是正确的答案吗?
  • 您应该重新考虑返回 null Stream 的方法,这是一个糟糕的主意。 好点子。改为返回空流会有什么问题?
  • @OleV.V.如果你问我,正好为零。
  • 即使您决定用更复杂的结构替换直接三元运算符,您也可以选择直接替换 Optional.ofNullable(guestsTravelWith).orElse(Stream.empty())(或 orElseGet(Stream::empty))或更多复杂的构造,例如Stream.ofNullable( guestsTravelWith).orElse(Stream.empty()).flatMap(Function.identity())...顺便说一句,Stream.ofNullable(…) 在 Java 8 中不可用。无论如何,当您使用 Java 9 或更新版本时,Objects.requireNonNullElse(guests, Stream.empty()) 甚至比使用 Optional 更好。
【解决方案2】:

为什么不只过滤掉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);

Holger 的评论更新
Stream.concat 应替换为 Stream.of 和 null-safe Stream::flatMap

&lt;R&gt; Stream&lt;R&gt; flatMap(Function&lt;? super T,? extends Stream&lt;? extends R&gt;&gt; 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);

输出:

1
2
null
4

【讨论】:

    【解决方案3】:

    如果您使用的是 Java 9,请使用 Strem.ofNullable

    返回一个包含单个元素的顺序流,如果非空, 否则返回一个空流。

    【讨论】:

    • 看起来问题不是可能为 null 的 element,而是可能为 null 的 stream
    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多