Sar*_*ino 8 java lambda optional java-8 java-stream
有一个可选的可选列表,例如:
Optional<List<Optional<String>>> optionalList = Optional.of(
Arrays.asList(
Optional.empty(),
Optional.of("ONE"),
Optional.of("TWO")));
Run Code Online (Sandbox Code Playgroud)
如何遍历optionalList以打印出字符串的ONEand TWO?
有一个可选的可选流怎么样?
Optional<Stream<Optional<String>>> optionalStream = Optional.of(
Stream.of(
Optional.empty(),
Optional.of("ONE"),
Optional.of("TWO")));
Run Code Online (Sandbox Code Playgroud)
更新:感谢您的回答,optionalStream 的解决方案(非嵌套):
optionalStream
.orElseGet(Stream::empty)
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
首先,检查是否Optional存在。如果是,则流式传输列表并过滤非空列表并打印每个列表。
optionalList.ifPresent(list -> list.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
流案例也几乎相似
optionalStream.ifPresent(stream -> stream
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
如果您可以使用 Java 9,则可以这样做:
optionalList.ifPresent(list -> list.stream()
.flatMap(Optional::stream)
.forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
对于一个可选的流,它是相同的,没有第一次.stream()调用。
使用 Java 8,您没有Optional::stream可用的方法,因此您可以自己完成:
optionalList.ifPresent(list -> list.stream()
.flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
.forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
对于 a Streamof Optionals,它看起来像这样:
optionalStream.ifPresent(stream -> stream
.flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
.forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
您确实可以Option<String>仅流式传输和过滤非空值。
Optional<List<Optional<String>>> optionalList = Optional.of(Arrays.asList(Optional.empty(), Optional.of("ONE"), Optional.of("TWO")));
optionalList.orElseGet(ArrayList::new)
.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
您也可以Optional.ifPresent()按照另一个答案中的建议使用:
optionalList.ifPresent(l -> l.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println));
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢第一种方式,因为它消除了嵌套级别:我觉得阅读起来更愉快。
optionalList.stream().flatMap(List::stream).filter(Objects::nonNull).forEach(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21860 次 |
| 最近记录: |