【问题标题】:Iterating through nested collections to find first sub-sub-sub element matching a criterion遍历嵌套集合以查找匹配条件的第一个子子子元素
【发布时间】:2016-10-03 09:44:24
【问题描述】:

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

    @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。

提前致谢。

【问题讨论】:

    标签: foreach java-8 java-stream


    【解决方案1】:

    你可以像这样尝试 flatMap:

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

    但请注意,如果您有巨大的树,您可能会遇到问题,因为 flatMap 并不是完全懒惰的。见:

    【讨论】:

    • 非常感谢这个答案,现在它可以编译了,特别是你提供的链接。我现在有一个基础来了解发生了什么。我会马上调查的。我确实有延迟初始化问题...
    • 谢谢!你的答案正是我想要的——否则我不会发布this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多