【问题标题】:How to use the Optional.ofNullable and Stream如何使用 Optional.ofNullable 和 Stream
【发布时间】:2020-01-22 20:29:03
【问题描述】:

我正在做一个测试用例,将 Optional.ofNullable 和 Stream 一起使用,我面临着同样的方法,两者都有相同的输出。

List<String> list1 = List.of("abc","abc");
Optional.ofNullable(list1).stream().flatMap(List::stream).map(e -> e.concat("def")).collect(Collectors.toList());

List<String> list2 = List.of("abc","abc");
Stream<String> stream = Optional.ofNullable(list2).map(List::stream).orElseGet(Stream::empty);
stream.map(e-> e.concat("def")).collect(Collectors.toList());

我的问题是,为什么在第一个示例中我使用 flatMapma​​p 而在第二个示例中我使用两个 ma​​p's做同样的工作。如果我在第一个示例中尝试使用两个地图,则它不起作用。

【问题讨论】:

  • 如果您将flatMap 替换为map,那么您最终会得到Stream&lt;Stream&lt;String&gt;&gt;,而不是Stream&lt;String&gt;
  • 我理解这一点,如果我将第一个替换为地图,它将返回一个 Stream> ,但是为什么在第二个示例中,当我使用变量流接收时它,它返回一个 Stream ?
  • 我阅读了文档,但仍然不清楚,为什么它会这样工作。

标签: java java-stream optional


【解决方案1】:

要了解正在发生的事情,查看所有返回类型会有所帮助:

第一个例子:

List<String> list1 = List.of("abc","abc");

List<String> result = 
    Optional.ofNullable(list1)          // Optional<List<String>>
        .stream()                       // Stream<List<String>>
        .flatMap(List::stream)          // Stream<String>
        .map(e -> e.concat("def"))      // Stream<String>
        .collect(Collectors.toList());  // List<String>

在本例中,您直接从Optional&lt;List&lt;String&gt;&gt; 转到Stream&lt;List&lt;String&gt;&gt;,然后使用后一个接口的方法。这里使用的方法是(按顺序):

  1. Optional#ofNullable(T)
  2. Optional#stream()
  3. Stream#flatMap(Function)
  4. Stream#map(Function)
  5. Stream#collect(Collector)

第二个例子:

List<String> list2 = List.of("abc","abc");

List<String> result =
    Optional.ofNullable(list2)          // Optional<List<String>>
        .map(List::stream)              // Optional<Stream<String>>
        .orElseGet(Stream::empty);      // Stream<String>
        .map(e-> e.concat("def"))       // Stream<String>
        .collect(Collectors.toList());  // List<String>

在本例中,您从Optional&lt;List&lt;String&gt;&gt; 转到Optional&lt;Stream&lt;String&gt;&gt;(另一个可选),然后通过Optional#orElseGet(Supplier) 提取Stream&lt;String&gt;。之后,您使用Stream 接口的方法。这里使用的方法是(按顺序):

  1. Optional#ofNullable(T)
  2. Optional#map(Function)
  3. Optional#orElseGet(Supplier)
  4. Stream#map(Function)
  5. Stream#collect(Collector)

【讨论】:

  • 虽然实际上应该避免Optional.of**(Collection&lt;&gt;)
  • 首先,Slaw,感谢您提供真正解释的答案。
  • 还有纳曼,你为什么这么说?在这种情况下,如果没有 Optional 怎么办?一个如果?提前致谢。
  • @ArturReis Optional 通常仅用作返回类型,以指示结果可能存在或不存在。在本地创建 Optional 只是为了使用它的方法并为您的代码提供更实用的样式是不受欢迎的——至少在某些社区中是这样。我个人不喜欢。此外,当一个集合用作返回类型时,最好的做法是返回一个 empty 集合来表示没有结果,而不是 null。所以有一个包含集合的Optional 是可疑的。我相信这就是纳曼所指的。
  • Optional.ofNullable(list1).stream()已过时,可以直接使用Stream.ofNullable(list1)
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多