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