如果不为null,则将值放入map中

时间:2018-01-05 15:22:30

标签: java collections hashmap

Java是否有像

这样的东西
map.putIfValueNotNull(key, value)

因此,只有在没有明确检查的情况下它不为空时,我才能将值放在地图中。

4 个答案:

答案 0 :(得分:6)

你可以使用computeIfAbsent()函数检查密钥是否已经在地图中,如果它在那里它没有做任何事情。 如果密钥不存在,那么它会检查计算的值是否为空,如果不是,则将其放入映射中。

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

注意,putIfAbsnet会将空值放入地图中。

答案 1 :(得分:5)

我知道org.apache.commons.collections4.MapUtils包含方法safeAddToMap(),但如果valuenull,则会添加empty string,这不是您想要的。

我不喜欢变体,要覆盖HashMap来实现新方法,因为在这种情况下,您没有其他实现:TreeMapLinkedHashMap或其他。

我不知道这个函数存在于某些可用库中,如Apache或类似的。

因此,在我的项目中,我必须自己实施:

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

答案 2 :(得分:2)

我尝试了以下操作,似乎有效。

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

我不知道是否有表现或其他考虑因素会使这种方式不受欢迎。它看起来很干净。如果object1object2为空,则他们不会在地图中结束。当我运行这个时,我得到以下结果。

{key1=blah}

请注意,如果地图中已存在具有相同键的值,则会替换该值。

答案 3 :(得分:1)

根据Java documentation,如果指定的键尚未与某个值关联(或已映射为null),则尝试使用给定的映射函数计算其值并将其输入此映射中,除非为null 。

一个简单的例子:

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

此输出为-

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

很明显,如果通过computeIfAbsent方法添加,则输出不包含空值,而如果通过普通put方法添加,则存在空值。