我有一个具有三个属性num和nature和autre_nature的Parcelle类。以及Parcelle listParcelles的列表。我正在使用Java 8 Streams,我想要实现的是按num分组并返回同时具有非null性质和autre_nature属性的Parcelle,否则就从该组中随机返回一个Parcelle。

Example :
Input:

    ligneParcelles[[num=1,nature=TC,autre_nature=TCC],
                   [num=1,nature=TC,autre_nature=null],
                   [num=2,nature=TC,autre_nature=null],
                   [num=3,nature=TC,autre_nature=null],
                   [num=3,nature=Alpha,autre_nature=null],
                   [num=4,nature=TC,autre_nature=TC]
                   [num=4,nature=TC,autre_nature=null]]
Output :
    ligneParcelles [[num=1,nature=TC,autre_nature=TCC],
                   [num=2,nature=TC,autre_nature=null],
                   [num=3,nature=Alpha,autre_nature=null],
                   [num=4,nature=TC,autre_nature=TC]]


为了进行分组,我使用了以下代码:

Map<String, List<Parcelle>> mapLignesParcelles = listParcelles.stream()

          .collect(Collectors.groupingBy(lp->lp.getNum()+""));


但是我不确定要使用什么来获得最终结果,我可以流mapLignesParcelles键集,并想到与谓词lp.getNature()!=null && lp.getAutre_Nature() !=null的anymatch,但是当谓词不成立时,如何表达返回任何元素的事实呢?

最佳答案

您似乎正在寻找每个NumParcelle形式的单个映射,而不是Map<String, Parcelle>中的List映射。一种方法是在收集为时使用groupingBy

Map<String, Parcelle> output = listParcelles.stream()
        .collect(Collectors.toMap(a -> a.getNum() + "", a -> a,
                (parcelle1, parcelle2) -> parcelle1.getNature() != null
                        && parcelle1.getAutre_nature() != null ? parcelle1 : parcelle2));


分组之前的另一个可能是:

Map<String, Parcelle> output = mapLignesParcelles.entrySet().stream()
        .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), e.getValue()
                .stream()
                .filter(lp -> lp.getNature() != null && lp.getAutre_nature() != null)
                .findAny()
                .orElse(e.getValue().get(new Random().nextInt(e.getValue().size())))))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

10-08 10:52