当前位置: 首页 > 知识库问答 >
问题:

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

阚通
2023-03-14

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

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

如何遍历选项列表打印字符串的一个两个

有一个可选的可选流怎么样?

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);

共有3个答案

连正信
2023-03-14

您确实可以流式处理选项

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);

您也可以使用Optional.ifPresent(),如其他答案所建议的:

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

就我个人而言,我更喜欢第一种方式,因为它删除了嵌套的级别:我发现它更容易阅读。

红甫
2023-03-14

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

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

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

对于Java8,您没有可用的可选::流方法,因此您可以自己执行:

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

对于可选Stream,它看起来像这样:

optionalStream.ifPresent(stream -> stream
  .flatMap(opt -> opt.map(Stream::of).orElseGet(Stream::empty))
  .forEach(System.out::println));
陈昂熙
2023-03-14

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

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));
 类似资料:
  • 我有一个项目数组,每个项目都有一个天数。每天都会有多个项目,但我想动态构建一个包含每天列的表。这是我到目前为止的代码。 显然,这会为每个项目生成一个新列,而不管当天是否已经看到了前一个项目。我希望它跳过制作一个新的列,如果该列已经存在的一天,并创建一个如果它不存在。 我该怎么办?

  • 问题内容: 我有一个这样的清单清单。 现在,我需要遍历上面的列表并输出一个字符串列表,如下所示(原始列表中没有数字) 问题答案: 准确执行您指定的操作的最简单解决方案是: 这基本上等效于迭代版本: 但是,这并不是遍历具有任意维数的多维列表的通用方法,因为嵌套列表推导/嵌套的for循环可能很难看。但是,对于2或3维列表,您应该放心。 如果您确实决定需要平整3个以上的尺寸,我建议实现一个递归遍历函数,

  • 我有一张自助表 我想做的是,当用户选中任何复选框时,在“选择”数据字段中,更改标题和描述的外观,例如,删除/斜体。我想使用这个“复选框”给用户一个直观的指示,一旦用户单击,这些行将从数据库中删除,一个单独的“删除”按钮。 提前感谢。

  • 我有一个产品集合,每个产品都会有: 价格 属性(例如:大小:xl,s,xxl;颜色:黄,红,蓝;....) 制造商 类别(一个产品可以有多个类别) 此集合在ElasticSearch中索引。现在,当我查询类别A中所有产品的列表时,我还希望获得: 所有产品的价格范围(最小-最大) 所有可能选项和值的列表(大小、颜色和相应的值xl、s、xxl、Yellog、red、blue) 制造商(耐克、阿迪达斯、

  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引用来回答。 我说的是一个人的名单。我必须遍历此列表才能找到id为X的人,如果找到,我必须更新该人的某些属性: 这段代码对我来说很有用,但我不确定这是为了实现什么,我正在使用它。映射我并不真正需要的返回值,所以我想知道是否有更好的方法来实现这一点?

  • 输入是一个列表列表。请看下面。文件名是一个列表,包含的名称与列表中的列表数量相同(,,) 每个名称都附加到路径中:-- 程序在遍历列表时遍历包含路径的列表,并打印路径及其文件名。我希望输出是--。然而,我得到了下面的输出。请查看输入后的输出 输入 输出 我希望输出是-- 然而,我得到的结果如下: 我无法理解为什么在遍历列表时不能使用文件名遍历路径列表。我希望这有助于澄清问题。有人能帮忙吗? 我已经