迭代嵌套集合以查找匹配条件

时间:2016-10-03 09:44:24

标签: foreach java-8 java-stream

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以像这样尝试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不是完全懒惰的。参见: