Java 如果不为空,则将值放入映射

Java 如果不为空,则将值放入映射,java,collections,hashmap,Java,Collections,Hashmap,Java有类似的功能吗 map.putIfValueNotNull(key, value) 因此,只有当值不为null时,我才能在映射中输入值,而无需显式检查。我知道org.apache.commons.collections4.MapUtils包含方法safeAddToMap(),但如果value为null,它会添加空字符串,这不是您想要的 我不喜欢variant来覆盖HashMap来实现新方法,因为在这种情况下,其他实现中没有它:TreeMap或LinkedHashMap或其他 我不知道这

Java有类似的功能吗

map.putIfValueNotNull(key, value)

因此,只有当值不为null时,我才能在映射中输入值,而无需显式检查。

我知道
org.apache.commons.collections4.MapUtils
包含方法
safeAddToMap()
,但如果
value
null
,它会添加
空字符串,这不是您想要的

我不喜欢variant来覆盖
HashMap
来实现新方法,因为在这种情况下,其他实现中没有它:
TreeMap
LinkedHashMap
或其他

我不知道这个函数是否存在于一些可用的库中,比如
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;
}
公共静态映射addNotNull(映射映射,K键,V值){
if(值!=null)
map.put(键、值);
返回图;
}

您可以使用
computeIfAbsent()
函数检查密钥是否已在地图中。如果它在那里,它什么也不做。 如果该键不存在,那么它将检查计算值是否为null,如果不存在,则将其放入映射中

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

小心,
putIfAbsent
会将空值放入映射。

我尝试了以下方法,似乎有效

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);
请注意,如果映射中已存在具有相同键的值,则该值将被替换。

根据java,如果指定的键尚未与值关联(或映射为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);
}

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

这是一个非常糟糕的命名选择,
putIfValueNotNull(…)
更合适。但是不,没有指定这样的方法。您可以从扩展映射创建自己的方法,但它实际上只是一个额外的if语句,因此返回是一个更复杂的类,只需节省一行即可。@Compass或您只需使用此方法的默认实现扩展接口=),将您自己的类放在java.util.HashMap上,并使用适当的假设(如@NotNull注释)定义此类方法。@ArifMustafa
@NotNull
只是一个注释,不需要检查。最好使用我认为他想要的是,如果地图为空,就不要在地图上放任何东西。这不符合OP的要求。当传递的值不为null时,您的代码的行为不像
put
,也就是说,它不会覆盖值不满足要求。这不正是HDCase的行为吗?如果我已经有了给定键的映射,例如,
map.put(“3”to do”)
-
computeIfAbsent(“3”,“3”)
将不会替换它。这不符合OP的要求。当传递的值不为null时,您的代码的行为不像
put
,也就是说,它不会覆盖值一个小小的澄清:如果通过调用Map#compute为现有键放置null值,则该键将从映射中删除这不符合OP的要求,因为,如果传递的值为null,并且已经存在具有相同键的条目,则会从映射中删除该条目
put
从不删除任何条目您不需要返回
map
。使用此方法后,
映射
将更改或不更改,因为您使用了
传递值
引用。
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}