Java 如果不为空,则将值放入映射
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或其他 我不知道这
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}