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

2022-09-03 18:14:56

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

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

如何遍历以打印出字符串的和?optionalListONETWO

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

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

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

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

答案 1

首先,检查 是否存在。如果是,则流式传输列表并过滤非空列表并打印每个列表。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));

答案 2

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

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

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

推荐