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

循环访问嵌套集合以查找与条件匹配的第一个子子元素

夔庆
2023-03-14

我有一个带有其他对象列表的对象,每个其他对象都有一个列表等。我需要在层次结构中找到层次结构中具有匹配某个值的属性的第一个(也是唯一的)最后一个元素。看到我现在的代码会更清楚:

    @Override
public Poste findByNumeroAndMillesime(String numero, Millesime millesime) {
    return millesime
            .getDivisions()
            .stream()
            .filter(
                    division -> division
                    .getGroupes()
                    .stream()
                    .filter(
                          groupe -> groupe
                          .getClasses()
                          .stream()
                          .filter(
                                  classe -> classe
                                  .getSousClasses()
                                  .stream()
                                  .filter(
                                          sousClasse -> sousClasse
                                          .getPostes()
                                          .stream()
                                          .filter(poste -> numero.equals(poste.getNumero()))
                                          .findFirst()
                                          .get()
                                          ))));

}

我需要返回与作为参数传递的Poste具有相同编号的Poste。

提前谢谢。

共有1个答案

苍嘉澍
2023-03-14

你可以像这样尝试平面地图:

Optional<Postes> first = 
        millesime.getDivisions()
              .stream()
              .flatMap(m -> m.getGroupes().stream())
              .flatMap(m -> m.getClasses().stream())
              .flatMap(m -> m.getSousClasses().stream())
              .flatMap(m -> m.getPostes().stream())
              .filter(postes -> numero.equals(postes.getNumero()))
              .findFirst();

但是如果你有一棵大树,请注意你可能会遇到的问题,因为平面地图并不完全懒惰。参见:

    "
  • 为什么在Java流中"不完全"惰性地"过滤"()?
  • "
  • 在Java中,如何高效且优雅地流式传输树节点的后代?
 类似资料:
  • 我有一个字符串列表,每个字符串有一个或多个单词。我需要从这个列表中列出一个独特的单词。我可以很容易地用两个嵌套的循环来完成,但我不明白为什么我不能用一个集合理解得到同样的结果。 嵌套循环: 嵌套循环的结果(正确): 集理解: 集合理解结果(不正确): 为什么我不能从设定的理解中得到同样的结果?

  • 如何在流中获得第一个匹配条件的元素?我试过了,但不起作用 如果条件不起作用,则在Stop以外的其他类中调用filter方法。

  • 我有一个关于使用“永远”类型的穷举开关/情况的问题。 比如说,我有一组字符串:{a,B}(字符串可以是任意长的单词,而且集合本身可能非常大),对于每个子集(比如{},{a,B}),我想创建一个函数:show:Set= 预发伪代码: 是否有可能在编译时保证show函数中包含所有可能的子集?所以把C加到集合{A,B,C}需要我扩充show函数吗?并为{C}、{A,C}、{B,C}和{A,B,C}添加案

  • 问题内容: 如果我有一个看起来像这样的表: 还有一个THINGS表,如下所示: 我正在尝试提出一个纯SQL查询,该查询可以让我找出什么可以访问什么。基本上,我想要一个看起来像这样的查询: 并返回“ John”和“ Mary”。关键是访问事物所需的许可数量是任意的。 我觉得这应该很明显,但是我无法提出一个优雅的解决方案。首选与Oracle兼容的解决方案。 编辑: Kosta和JBrooks的解决方案

  • 问题内容: 我想要一种惯用的方式来找到与谓词匹配的列表中的第一个元素。 当前代码非常丑陋: 我已经考虑过将其更改为: 但是必须有一些更优雅的方法……如果返回一个值而不是没有找到匹配项引发异常,那将是一个很好的选择。 我知道我可以像这样定义一个函数: 但是,如果已经有内置的插件开始用这样的实用函数填充代码,这是很鸡肋的(人们可能不会注意到它们已经在那里,因此随着时间的推移它们会不断重复出现)。 问题

  • 下面是我用(FacetModels)填充我的收藏的内容 如何访问可用值[]数组 “FacetModels”:[{“FacetDisplayLabel”:null,“SelectedValues”:[],“AvailableValues”:[],“UnknownResults”:0,“ActionURI”:null,“FacetGroupName”:“Category”,“FacetGroupFri