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

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

万俟靖
2023-03-14

我有一个具有三个属性num和自然和autre_nature的类Parcelle。和一个列表Parcelle listParelles。我正在体验Java8流,我想实现的是按num分组并返回同时具有非空性质和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()+""));  

但我不确定要使用什么来获得最终结果,我可以流式处理mapliginesparcelles键集,并且我想到了使用谓词lp的任何匹配。getNature()=无效的


共有2个答案

董霖
2023-03-14
stream
    .filter(yourCondition)
    .findFirst()
    .orElse(randomlySelectedObject);

您有一个stream,您可以根据您的条件对其进行筛选,您可以尝试获取与条件匹配的第一个元素,如果找到,则返回它,否则返回随机选择对象

谷梁宝
2023-03-14

您似乎在寻找每个Num到单个Parcelle的映射,其形式为Map

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

 类似资料:
  • 如何将侦听器设置为一个映射,该映射的键有一个复杂的对象,并且我只想侦听具有特定键参数值的条目发生的更改。 例如,我有一个类似于此的代码: 但当一个包含“EN”语言的键的条目被更新时,我的回调函数不会被调用。所以我假设我的谓词是错误的。

  • 我有一个Hazelcast地图的HashMap作为我下面所示的值。 我想使用谓词/SQLPredicate执行查询。我该怎么做? 请帮帮我。

  • 我正在尝试构建一个方法,删除具有非空属性的条目,但我一直在谓词中失败,我不知道如何正确实现谓词,因为hazelcast没有将“Not NULL”或“IS NULL”作为where子句任何想法如何在映射中找到我需要搜索以删除它们的值? 方法 主类响应SerializablePlus

  • 我在应用程序中使用Querydsl来大大改进查询数据库的代码。但是,我有一个来自外部服务的JPA谓词(javax.persistence.criteria.Predicate)。我想混合使用Querydsl和外部谓词创建的查询。例如: 另一个解决方案是将Querydsl谓词转换为JPA谓词: 有可能吗?如果是,我如何做到这一点?如果没有,是否有其他混合谓词的解决方案(比如将两者转换为SQL字符串并

  • 我是Hazelcast的新手-评估和原型设计,看看它是否适合我们的分布式内存缓存需求。其中一个要求是能够使用通配符在给定地图中搜索关键字。通过查看IMap文档,可以使用keySet(谓词谓词)。但我不知道如何使用谓词,在给定通配符字符串的情况下,返回一个包含所有匹配键的键集。举个例子会很有帮助。 我的代码片段。这是客户端。 谢谢

  • 下面的lexer语法片段应该根据类中定义的谓词来标记“自定义名称”: CUSTOM_NAME的正确匹配总是尽可能长的匹配。现在,如果lexer遇到一个自定义名称,比如,那么我希望它对整个字符串,然后用'some:cname'作为参数调用一次谓词。 编辑:这种行为的有趣之处在于,只要将部分匹配传递给谓词,谓词的结果似乎完全被lexer忽略了。这似乎效率很低。