小编Iva*_*van的帖子

为什么Java API在if语句中有看似奇怪的赋值?

我是编程和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)

java java-8

10
推荐指数
1
解决办法
263
查看次数

在构造函数方法引用中,使用泛型类型参数之间的区别与否?

我正在阅读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,它似乎可以.

java generics lambda effective-java method-reference

8
推荐指数
1
解决办法
273
查看次数