java - 在映射键集流上应用带有 anyMatch() 的谓词,并在谓词为假时返回一些结果

标签 java java-8 java-stream predicate

我有一个 Parcelle 类,它具有三个属性 numnature 以及 autre_nature。和 Parcelle listParcelles 列表。我正在体验 Java 8 Streams,我想要实现的是按 num 分组并返回 Parcelle ,它同时具有非 null natureautre_nature 属性,否则只从组中随机返回一个 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 但当谓词不成立时,我如何表达返回任何元素的事实?

最佳答案

您似乎在寻找每个 Num 的映射到一个Parcelle形式为 Map<String, Parcelle>而不是 ListgroupingBy .一种方法是使用 toMap同时收集为:

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

关于java - 在映射键集流上应用带有 anyMatch() 的谓词,并在谓词为假时返回一些结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57258677/

相关文章:

java - ccnx android java :not found

java - Android游戏本地多人游戏实现

java - 纹理渲染不正确(OpenGL)

java - 无法在Windows 10中安装JDK 8

java - 将字符串分成多个部分

java - Netbeans上传网站到服务器

java - 简单的 lambda 结构被替换为内联代码

java - 使用流处理异常

Java 流惰性 vs 融合 vs 短路

java - 使用流将一个类对象转换为另一个类对象