Java 如何使用流API比较两个具有不同值的映射?

Java 如何使用流API比较两个具有不同值的映射?,java,java-stream,Java,Java Stream,有两个映射和一个接受它们并返回新映射的方法。 映射包含相同数量的相同键,但它们的值​​它们是不同的 Map<String, Boolean> a = new HashMap<>(); Map<String, Boolean> b = new HashMap<>(); a.put("a", false); a.put("b", true); a.put("c&

有两个映射和一个接受它们并返回新映射的方法。 映射包含相同数量的相同键,但它们的值​​它们是不同的

    Map<String, Boolean> a = new HashMap<>();
    Map<String, Boolean> b = new HashMap<>();

    a.put("a", false);
    a.put("b", true);
    a.put("c", true);

    b.put("a", true);
    b.put("b", true);
    b.put("c", false);

public static Map<String, Boolean> getNewMap(Map<String, Boolean> a, Map<String, Boolean> b) 
{
    Map<String, Boolean> newMap = new HashMap<>();
    for (Map.Entry<String, Boolean> mapB : b.entrySet())
        for (Map.Entry<String, Boolean> mapA : a.entrySet()) {
            if (mapB.getKey().equals(mapA.getKey()) && 
               !mapB.getValue().equals(mapA.getValue())) {
                newMap.put(mapB.getKey(), mapB.getValue());
            }
        }
    return newMap;
}
该方法查找相同的键,并将键和第二个映射的不同值写入新映射

该方法的结果将是包含以下元素的映射: a:是的 c:错

如何通过使用流API和lambda表达式替换循环和条件来减少代码量?

流化第二个映射并收集与第一个映射具有不同值的所有条目


如果可以修改原始b,则不需要流操作,编辑:只需使用removeAll,如果不可以,则可以先制作副本

    b.entrySet().removeAll(a.entrySet());
    System.out.println(b);
输出是您所说的您想要的:

{a=true,c=false}

多亏厄立特里亚人建议撤军而不是撤军,这是一个明显的进步

如果为了不修改原件b而需要复制,我建议

    Map<String, Boolean> result = new HashMap<>(b);
    result.entrySet().removeAll(a.entrySet());

两张地图的键是否保证相同?如果它们不是,您希望发生什么?我建议使用removeAll而不是removeIf,这样可以减少比较的需要。b、 entrySet.removeAlla.entrySet;返回b@厄立特里亚的建议显然很好,非常感谢。我编辑过。
    b.entrySet().removeAll(a.entrySet());
    System.out.println(b);
    Map<String, Boolean> result = new HashMap<>(b);
    result.entrySet().removeAll(a.entrySet());