Feature suggestion: Provide efficient way for nullable value lookup in Map

some-java-user-99206970363698485155 at vodafonemail.de some-java-user-99206970363698485155 at vodafonemail.de
Fri Jan 4 23:34:17 UTC 2019


The methods currently provided by the Map interface (https://docs.oracle.com/javase/8/docs/api/java/util/Map.html) do not provide an efficient way to look up nullable values. This problem would be solved if JDK-6552529 was implemented, but that will likely not be happening since the interface cannot be changed without breaking compatibility.

Ways to currently look up nullable values are:

* Combined ussage of `get()` and `containsKey()` -> inefficient
* Usage of `getOrDefault()` with private no-value constant, e.g.:
private static final Object NO_VALUE = new Object();
// ...
V value = map.getOrDefault(key, (V) NO_VALUE);
if (value == NO_VALUE) {
     // No value
}
else {
     // Value exists
}

Both solutions are not really that great, therefore it would be good to provide an easier and (if overridden) more efficient method: default OptionalNullable<V> getOptional(Object key) {
    V value = get(key);
   
    if (value != null || containsKey(key)) {
        return OptionalNullable.of(value);
    }
    else {
        return OptionalNullable.empty();
    }
}

Where `OptionalNullable` is a new class similar to `Optional` except that null is considered a value.

Maybe a `void ifExists(K key, Consumer<V> consumer)`, which makes the consumer consume the value if it exists (= nullable), would be good as well to avoid creation of `OptionalNullable` objects, though that method might (at least for performance reasons) become obsolute when `OptionalNullable` becomes a value type.


More information about the core-libs-dev mailing list