11 votes

Java 8 Map of Collections supprimer un élément de la collection et supprimer l'entrée si elle est vide

J'ai une carte pour laquelle les valeurs sont une collection. Étant donné une clé, je veux supprimer un élément de la collection et le retourner, mais je veux également supprimer l'entrée si la collection est vide. Existe-t-il un moyen de faire cela de manière rapide en utilisant l'une des nombreuses nouvelles méthodes Map de Java 8 ?

Un exemple simple (j'utilise une pile mais il pourrait s'agir d'une liste, d'un ensemble, etc.) Pour les besoins de l'exemple, disons qu'il est déjà vérifié que la carte contient la clé.

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

J'ai essayé de faire quelque chose comme

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

Mais même s'il supprime effectivement l'entrée si elle est vide, je ne sais pas comment obtenir la valeur renvoyée par la fonction pop() .

-1voto

/* quite ugly
String rv = Optional.ofNullable(map.get(1)).map(stack -> {
            if (!stack.isEmpty()) {
                String v = stack.pop();
                if (stack.isEmpty()) {
                    map.remove(1);
                }
                return v;
            }
            return null;
        }).orElse(null);
*/ 

@Test
public void test() {
    {
        Map<Integer, Stack<String>> map = new HashMap<>();
        Stack<String> s = new Stack<String>();
        s.addAll(Arrays.asList("a", "b"));
        map.put(1, s);
        String rv = Optional.ofNullable(map.get(1)).map(stack -> {
            if (!stack.isEmpty()) {
                String v = stack.pop();
                if (stack.isEmpty()) {
                    map.remove(1);
                }
                return v;
            }
            return null;
        }).orElse(null);
        Assert.assertEquals("b", rv);
        Assert.assertEquals(1, map.get(1).size());
        Assert.assertEquals("a", map.get(1).iterator().next());
    }
    {
        Map<Integer, Stack<String>> map = new HashMap<>();
        Stack<String> s = new Stack<String>();
        s.add("a");
        map.put(1, s);
        String rv = Optional.ofNullable(map.get(1)).map(stack -> {
            if (!stack.isEmpty()) {
                String v = stack.pop();
                if (stack.isEmpty()) {
                    map.remove(1);
                }
                return v;
            }
            return null;
        }).orElse(null);
        Assert.assertEquals("a", rv);
        Assert.assertNull(map.get(1));
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X