Java有类似于什么东西吗?
map.putIfValueNotNull(key, value)
我只能在没有进行显式检查的情况下将值放入地图中,前提是它不为null。
Java有类似于什么东西吗?
map.putIfValueNotNull(key, value)
我只能在没有进行显式检查的情况下将值放入地图中,前提是它不为null。
Optional
:Optional.ofNullable(value).ifPresent(v -> map.put(key, v));
从正式意义上讲,这并不符合显式检查缺失的要求,但它仍然非常简短清晰,并且如果值为null
,则不会执行任何与 map 相关的操作。
org.apache.commons.collections4.MapUtils
中包含方法 safeAddToMap()
,但如果 value
是 null
,它会添加空字符串,这不是你想要的。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;
}
map
。由于使用了“按值传递”的引用,因此在此方法之后 map
可能会更改或不更改。 - Mykola ShoroburacomputeIfAbsent()
函数,它会检查键是否已经存在于映射中。如果存在,则不做任何操作。
如果不存在,则检查计算出的值是否为 null,并将其放入映射中(如果不是)。map.computeIfAbsent(key, val -> value);
注意,putIfAbsent
方法可能会将 null 值放入 Map 中。
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);
我不知道是否有性能或其他方面的考虑,使得这种方法不可取。在我看来,它看起来非常简洁。如果object1
或者 object2
是null,则它们不会出现在映射中。当我运行这个代码时,我得到了以下结果。
{key1=blah}
put
永远不会删除任何条目。 - fpspublic 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);
}
The output of this would be -
{1=ONE, 2=null, 3=THREE}
map.put("3", "to do")
,那么computeIfAbsent("3", "THREE")
将无法替换它。 - user85421put
一样运行,即它不会覆盖值。 - fps也许只需过滤生成的地图即可:
map.entrySet().stream()
.filter(e -> e.getValue() != null)
.collect(toMap(Entry::getKey, Entry::getValue))
putIfValueNotNull(...)
更为合适。但不幸的是,Map
接口 没有指定这样的方法。 - Turing85@NotNull
只是一个注解,并不一定会被检查。最好使用类似于Objects.requireNonNull(...)
这样的东西。 - Turing85