Java 8集合映射从集合中删除元素,如果为空则删除条目

Ric*_*ola 11 java collections dictionary hashmap java-8

我有一个地图,其值是一个集合.给定一个键,我想删除该集合的一个元素并将其返回,但如果该集合为空,我还想删除该条目.有没有办法使用Java 8的众多新Map方法之一以简短的方式完成此操作?

一个简单的例子(我使用Stack但它可以是List,Set等).为了示例,我们假设已经检查了地图包含密钥.

public static String removeOne(Map<Integer, Stack<String>> map, int key) {
    Stack<String> stack = map.get(key);
    String result = stack.pop();
    if(stack.isEmpty()){
        map.remove(key);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我试过做类似的事情

map.compute(1, (k, v) -> {v.pop(); return v.size() == 0 ? null : v;});
Run Code Online (Sandbox Code Playgroud)

但即使它确实删除了条目,如果为空,我不知道如何获取返回的值pop().

Eug*_*ene 5

嗯,它甚至比你现有的还要丑陋,但是有一种方法,我想:

public static String removeOne(Map<Integer, Stack<String>> map, int key) {
    String[] removed = new String[1];
    map.compute(key, (k, v) -> {
        removed[0] = v.pop();
        return v.size() == 0 ? null : v;
    });
    return removed[0];
}
Run Code Online (Sandbox Code Playgroud)

问题是merge/compute等等返回,并且在您的情况下是Stack/Set/List该集合中的一个,而不是单个元素.

  • 哈哈哈,我实际上想过这个解决方案,但正如你所说,它真的很难看. (2认同)

Ous*_* D. 2

有没有一种方法可以使用 Java 8 的众多新 Map 方法之一以简短的方式完成此操作?

从 JDK8 开始,没有任何新方法可以改进代码,无论是在可读性还是效率方面。

如果您这样做是为了自己练习,那么我可以在某种程度上理解为什么您想要缩短代码(如果可能的话),但是当涉及到生产代码时,应该避免打高尔夫球,而是采用以下方法:最具可读性和可维护性;如果更长也没关系。

你的方法本身就很好。