如何使用 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());
我的问题是,为什么在第一个示例中我使用 flatMap 和 map 而在第二个示例中我使用两个 地图的做同样的工作。如果我在第一个示例中尝试使用两个地图,则它不起作用。
要了解正在发生的事情,查看所有 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>>
,然后使用后一个接口的方法。这里使用的方法是(按顺序):
Optional#ofNullable(T)
Optional#stream()
Stream#flatMap(Function)
Stream#map(Function)
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
接口的方法。这里使用的方法是(按顺序):
我正在做一个同时使用 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());
我的问题是,为什么在第一个示例中我使用 flatMap 和 map 而在第二个示例中我使用两个 地图的做同样的工作。如果我在第一个示例中尝试使用两个地图,则它不起作用。
要了解正在发生的事情,查看所有 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>>
,然后使用后一个接口的方法。这里使用的方法是(按顺序):
Optional#ofNullable(T)
Optional#stream()
Stream#flatMap(Function)
Stream#map(Function)
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
接口的方法。这里使用的方法是(按顺序):