为什么Guava StandardTable put方法拒绝空值
Why Guava StandardTable put method refuse null value
Guava StandardTable class 覆盖 AbstractTable 的 put 方法
// in AbstractTable class
@CanIgnoreReturnValue
@Override
public V put(R rowKey, C columnKey, V value) {
return row(rowKey).put(columnKey, value);
}
// in StandardTable class
@CanIgnoreReturnValue
@Override
public V put(R rowKey, C columnKey, V value) {
checkNotNull(rowKey);
checkNotNull(columnKey);
checkNotNull(value);
return getOrCreate(rowKey).put(columnKey, value);
}
我创建table使用
Tables.newCustomTable(Maps.newLinkedHashMap(), Maps::newHashMap);
我的代码在某些情况下会将空值设置为table,但是gauva会在put方法中抛出异常,不解
我如何实现具有可为空值的标准 table? (我尝试实现 ForwardingTable,覆盖 get/put 方法,使用特定的 class 替换空值,但这还不够,例如:行方法将 return 映射包含特定的 class而不是空)
null
通常被视为任何 Collection
或 Map
中的键或值被视为错误的决定。 jdk 本身有一些示例,ConcurrentHashMap
不 允许空键或值,ConcurrentSkipListMap
和许多其他示例也是如此。
java-9
中添加的静态工厂方法也是如此,例如 Map::of
。即使 HashMap
确实 允许空键和空值,所以它们都不会失败:
HashMap<String, String> map = new HashMap<>();
map.put("", null);
map.put(null, "");
使用 HashMap
的任何新 java-8
方法将抛出 NullPointerException
:
// value trying to be null
chm.merge("", null, (k, v) -> k);
最后一点是所有 guava
集合都不是空容忍的,这对我来说是一个很好的决定。
Guava StandardTable class 覆盖 AbstractTable 的 put 方法
// in AbstractTable class
@CanIgnoreReturnValue
@Override
public V put(R rowKey, C columnKey, V value) {
return row(rowKey).put(columnKey, value);
}
// in StandardTable class
@CanIgnoreReturnValue
@Override
public V put(R rowKey, C columnKey, V value) {
checkNotNull(rowKey);
checkNotNull(columnKey);
checkNotNull(value);
return getOrCreate(rowKey).put(columnKey, value);
}
我创建table使用
Tables.newCustomTable(Maps.newLinkedHashMap(), Maps::newHashMap);
我的代码在某些情况下会将空值设置为table,但是gauva会在put方法中抛出异常,不解 我如何实现具有可为空值的标准 table? (我尝试实现 ForwardingTable,覆盖 get/put 方法,使用特定的 class 替换空值,但这还不够,例如:行方法将 return 映射包含特定的 class而不是空)
null
通常被视为任何 Collection
或 Map
中的键或值被视为错误的决定。 jdk 本身有一些示例,ConcurrentHashMap
不 允许空键或值,ConcurrentSkipListMap
和许多其他示例也是如此。
java-9
中添加的静态工厂方法也是如此,例如 Map::of
。即使 HashMap
确实 允许空键和空值,所以它们都不会失败:
HashMap<String, String> map = new HashMap<>();
map.put("", null);
map.put(null, "");
使用 HashMap
的任何新 java-8
方法将抛出 NullPointerException
:
// value trying to be null
chm.merge("", null, (k, v) -> k);
最后一点是所有 guava
集合都不是空容忍的,这对我来说是一个很好的决定。