在阅读源代码时,我在JDK源中偶然发现了这种方法。请注意,声明和初始化v和newValue。我们这里有“不错”的未定义值、比较中的赋值(“很棒”)以及额外的括号以降低可读性。和其他代码异味。
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v;
if ((v = get(key)) == null) {
V newValue;
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
但为什么?以上述方式编写代码而不是简单的(理想情况下使用否定v比较)是否有任何实际好处:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v = get(key);
if (v == null) {
V newValue = mappingFunction.apply(key);
if (newValue != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
有没有我不知道的实际好处(除了炫耀 Java 构造),而不是采用“简单”的方式?
料青山看我应如是
繁星coding
猛跑小猪
相关分类