web-dev-qa-db-fra.com

Mettez la valeur dans la carte si elle n'est pas nulle

Est-ce que Java a quelque chose comme

map.putIfValueNotNull(key, value)

Je ne peux donc mettre de la valeur dans la carte que si elle n’est pas nulle sans vérification explicite.

3
Zimbo Rodger

Je sais que org.Apache.commons.collections4.MapUtils contient la méthode safeAddToMap(), mais si value est null, il ajoute empty string qui n'est pas ce que vous voulez.

Je n'aime pas la variante, pour remplacer HashMap pour implémenter une nouvelle méthode, car dans ce cas, vous ne l'avez pas pour d'autres implémentations: TreeMap ou LinkedHashMap ou autre.

Je ne sais pas si cette fonction existe dans une bibliothèque disponible, telle que Apache ou similaire.

Par conséquent, dans mes projets, je dois l'implémenter moi-même:

public static <K, V> Map<K, V> addNotNull(Map<K, V> map, K key, V value) {
    if(value != null)
        map.put(key, value);

    return map;
}
4
oleg.cherednik

Vous pouvez utiliser la fonction computeIfAbsent() qui vérifie si la clé est déjà dans la carte, si elle y est, elle ne fait rien. Si la clé n'est pas présente, elle vérifie si la valeur calculée est nulle et la met dans la carte si elle ne l'est pas.

map.computeIfAbsent(key, val -> value);

Attention, putIfAbsnet insère des valeurs nulles dans la carte.

4
HDCase

J'ai essayé ce qui suit et cela semble fonctionner.

Map<String, String> map = new HashMap<>();
String object1 = "blah";
String object2 = null;
map.compute("key1", (k, v) -> object1);
map.compute("key2", (k, v) -> object2);

System.out.println(map);

Je ne sais pas s'il existe des considérations de performance ou autres qui rendraient cette façon indésirable. Cela me semble plutôt propre. Si object1 ou object2 est null, ils ne se retrouvent pas dans la carte. Lorsque je lance ceci, j'obtiens le résultat suivant.

{key1=blah}

Notez que si une valeur avec la même clé est déjà dans la carte, elle sera remplacée.

2
gaoagong

Selon Java documentation , si la clé spécifiée n’est pas déjà associée à une valeur (ou si elle est mappée à null), tente de calculer sa valeur à l’aide de la fonction de mappage donnée et l’entre dans cette mappe sauf si la valeur est null. 

Un exemple simple à mettre:

public static void main(String[] args) {
    HashMap<String, String> map = new HashMap<>();
    map.put("1", "ONE");
    map.put("2", null);

    map.computeIfAbsent("3", val -> "THREE");
    map.computeIfAbsent("4", val -> null);

    System.out.println(map);
}

La sortie de ceci serait -

{1=ONE, 2=null, 3=THREE}

Il est clair que la sortie ne contient pas les valeurs NULL si elles ont été ajoutées via la méthode computeIfAbsent, alors qu'elles sont présentes si elles ont été ajoutées par la méthode put normale.

1
JavaFreak