如何使用 Optional.ofNullable 和 Stream

How to use the Optional.ofNullable and Stream

我正在做一个同时使用 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());

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

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

第一个例子:

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<List<String>> 转到 Stream<List<String>>,然后使用后一个接口的方法。这里使用的方法是(按顺序):

  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<List<String>> 转到 Optional<Stream<String>>(另一个可选),然后通过 Optional#orElseGet(Supplier) 提取 Stream<String>。之后,您使用 Stream 接口的方法。这里使用的方法是(按顺序):

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