Why java Map.merge does not pass a supplier?

Viewed 542

I want in java a method which allows me to modify a value if exist, or insert one if it doesn't. Similar to merge, but:

  1. I want to pass a value supplier and not a value, to avoid creating it when not needed
  2. In case the value exists, I don't want to reinsert it nor remove it, just access its methods with a container.

I had to write this. The problem with writing it myself is that the version for Concurrent maps is not trivial

public static <K, V> V putOrConsume(Map<K, V> map, K key, Supplier<V> ifAbsent, Consumer<V> ifPresent) {
    V val = map.get(key);
    if (val != null) {
      ifPresent.accept(val);
    } else {
      map.put(key, ifAbsent.get());
    }
    return val;
}
3 Answers
Related