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

新手上路,请多包涵

有一个可选的可选列表,例如:

 Optional<List<Optional<String>>> optionalList = Optional.of(
    Arrays.asList(
        Optional.empty(),
        Optional.of("ONE"),
        Optional.of("TWO")));

如何遍历 optionalList 打印出字符串的 ONETWO

拥有可选的可选流怎么样?

 Optional<Stream<Optional<String>>> optionalStream = Optional.of(
    Stream.of(
        Optional.empty(),
        Optional.of("ONE"),
        Optional.of("TWO")));

更新:感谢您的回答,optionalStream(非嵌套)的解决方案:

 optionalStream
    .orElseGet(Stream::empty)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .forEach(System.out::println);

原文由 Sara Vino 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 738
2 个回答

首先,检查 Optional 是否存在。如果是,则流式传输列表并过滤非空列表并打印每个列表。

 optionalList.ifPresent(list -> list.stream()
            .filter(Optional::isPresent)
            .map(Optional::get)
            .forEach(System.out::println));

流案例也几乎相似

optionalStream.ifPresent(stream -> stream
            .filter(Optional::isPresent)
            .map(Optional::get)
            .forEach(System.out::println));

原文由 user7 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果你可以使用 Java 9,它可以这样做:

 optionalList.ifPresent(list -> list.stream()
  .flatMap(Optional::stream)
  .forEach(System.out::println));

对于可选项流,它是相同的,没有第一个 .stream() 调用。

对于 Java 8,您没有可用的 Optional::stream 方法,因此您可以自己完成:

 optionalList.ifPresent(list -> list.stream()
  .flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
  .forEach(System.out::println));

对于 StreamOptional s 它看起来像这样:

 optionalStream.ifPresent(stream -> stream
  .flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
  .forEach(System.out::println));

原文由 jbx 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题