【问题标题】:Java 8 Stream Filter Map With Multiple condition具有多个条件的 Java 8 流过滤器映射
【发布时间】:2022-01-18 07:58:01
【问题描述】:

代码模板:

Map<String, String> hashMap = new HashMap<>();    
hashMap.put("RED", "1");    
hashMap.put("BLUE", "2");    
hashMap.put("BLACK", "3");    

Map<String, String> filteredMap = hashMap.entrySet().stream()
.filter(entry -> (entry.getKey().equals("RED") && entry.getValue().equals("1"))  
**&&**
(entry.getKey().equals("BLUE") && entry.getValue().equals("2")) )
.collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()));

我想知道 Map 中是否同时包含 {Red,1} 和 {Blue,2}。如何将两个过滤条件放在一个流中?我尝试了 && 条件,但它不起作用。请帮忙。

【问题讨论】:

    标签: java hashmap java-stream


    【解决方案1】:

    你为什么要在这里使用过滤器? 问题中显示的条目流过滤器遍历映射的所有成员( O(n) ) 但是,HashMap 保证 O(1) 访问“获取”功能。那么为什么要在这里牺牲性能呢?

    如果你想检查地图是否包含一个键(好的,两个键),为什么不简单:

    if("1".equals(hashMap.get("RED")) && "2".equals(hashMap.get("BLUE"))) {
       // yes, this map indeed contains both elements 
       // in case the "RED" is not in the map, the call to "get" will return null
    }
    

    【讨论】:

    • 谢谢,马克。你太棒了! :)
    【解决方案2】:

    流并不真正适合您的问题。它们非常适合对集合成员执行独立操作,然后以某种方式聚合结果。它们不适用于整个集合中的函数或需要成员之间交互的算法。

    一个更简单的公式是:

    Objects.equals(map.get("RED"), "1") && Objects.equals(map.get("BLUE"), "2")
    

    避免硬编码比较的替代方法是:

    Map<String, String> reference = Map.of("RED", "1", "BLUE", "2");
    
    if (hashMap.entrySet().containsAll(reference.entrySet()) {
        ...
    }
    

    【讨论】:

    • 谢谢,短跑选手。你太棒了! :)
    【解决方案3】:

    您可以将这两个条件放在一个过滤器中

        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("RED", "1");
        hashMap.put("BLUE", "2");
        hashMap.put("BLACK", "3");
    
        Map<String, String> filteredMap = hashMap.entrySet().stream()
                .filter(entry -> (entry.getKey().equals("RED") && entry.getValue().equals("1")
                        || (entry.getKey().equals("BLUE") && entry.getValue().equals("2"))))
                .collect(Collectors.toMap(map -> map.getKey(), map -> map.getValue()));
        System.out.println(filteredMap);
    

    【讨论】:

    • 感谢 Bhushan。你太棒了! :)
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2013-11-28
    • 2019-01-08
    相关资源
    最近更新 更多