我是编程和Java的新手.我注意到,在Java API中,if语句中有一些奇怪的赋值方法.
以下是Map界面的示例:
default V replace(K key, V value) {
V curValue;
if (((curValue = get(key)) != null) || containsKey(key)) {
curValue = put(key, value);
}
return curValue;
}
Run Code Online (Sandbox Code Playgroud)
以这种方式嵌套赋值是否有某种好处?这纯粹是一种风格选择吗?为什么不在curValue第一次声明时进行赋值?
// why not do it like this?
default V replace(K key, V value) {
V curValue = get(key); // not nested
if (curValue != null || containsKey(key)) {
curValue = put(key, value);
}
return curValue;
}
Run Code Online (Sandbox Code Playgroud)
我在Map界面和其他地方的许多新添加的Java 8方法中都注意到了这一点.这种嵌套分配的形式似乎是不必要的.
编辑:Map界面中的另一个示例:
default V computeIfAbsent(K key,
Function<? super K, ? extends …Run Code Online (Sandbox Code Playgroud) 我正在阅读Effective Java 3并注意到第43项中的这段代码:"首选方法引用lambdas":
TreeMap<K,V>::new
Run Code Online (Sandbox Code Playgroud)
注意类型参数.我一直都这么做:
TreeMap::new
Run Code Online (Sandbox Code Playgroud)
我使用Intellij并且从未收到有关此更改或任何更改建议的警告.事实上,当我让IDE将上面的方法引用更改为lambda时,它将其转换为
() -> new TreeMap<Integer, Integer>()
Run Code Online (Sandbox Code Playgroud)
包含类型参数的价值是什么?编译器不能根据变量的类型参数推断它吗?根据IDE如何将方法引用转换为lambda,它似乎可以.