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

Brian Goetz brian.goetz at oracle.com
Sun Jan 6 23:54:41 UTC 2019


FYI, the comment about compatibility was obsoleted by the addition of 
default methods in Java 8.

On 1/4/2019 6:34 PM, some-java-user-99206970363698485155 at vodafonemail.de 
wrote:
> 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