如果Java 8样式中存在值,如何从HashMap中删除

Vex*_*toR 4 java collections hashmap java-8

有一个Map<String, List<String>>。我想从删除值List如果Map包含密钥。

但是有没有办法用Java 8风格来做到这一点?像使用计算,合并或其他新方法一样?

以旧样式从列表中删除元素的代码:

public class TestClass {


    public static void main(String[] args) {
        Map<String, List<String>> map = new HashMap<>();
        map.put("key1", getList());
        map.put("key2", getList());

        //remove
        if (map.containsKey("key1")) {
            map.get("key1").remove("a2");
        }
        System.out.println(map);
    }

    public static List<String> getList(){
        List<String> arr = new ArrayList<String>();
        arr.add("a1");
        arr.add("a2");
        arr.add("a3");
        arr.add("a4");

        return arr;
    }   
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*cki 8

您可以使用,Map.computeIfPresent()但是改进值得怀疑:

map.computeIfPresent("key1", (k, v) -> { v.remove("a2"); return v; });
Run Code Online (Sandbox Code Playgroud)

  • 好吧,它只需要一次哈希查找,而不是两次。但另一方面,它不再适用于不可变的地图… (4认同)

Ole*_*.V. 6

我们不必对所有内容都进行 Java-8 化。你的代码很好。但是,如果您愿意,Karol 的建议很好,这是另一个建议:

    Optional.ofNullable(map.get("key1")).ifPresent(v -> v.remove("a2"));
Run Code Online (Sandbox Code Playgroud)

对于这是否是Optional. 这当然不是它的主要用途,但我认为它是可以接受的。