Читая исходный код, я наткнулся на этот метод в источниках 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-конструкций), вместо того, чтобы идти "простым" способом?