java lambda - 如何遍历可选列表/可选流

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)

use*_*er7 8

首先,检查是否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)


jbx*_*jbx 6

如果您可以使用 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)


dav*_*xxx 5

您确实可以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)

我个人更喜欢第一种方式,因为它消除了嵌套级别:我觉得阅读起来更愉快。


A. *_*jan 5

optionalList.stream().flatMap(List::stream).filter(Objects::nonNull).forEach(...)
Run Code Online (Sandbox Code Playgroud)