集合为什么Java在Map中没有putIfAbsent(key,supplier)方法?
我最近发现自己想要一个版本的putIfAbsent(…)在java中。util。映射,您可以向其提供某种工厂方法,以实例化尚未存在的对象。这将简化许多代码
这是我修改过的界面:
import java.util.Map;
import java.util.function.Supplier;
/**
* Extension of the Map Interface for a different approach on having putIfAbsent
*
* @author Martin Braun
*/
public interface SupplierMap<K, V> extends Map<K, V> {
public default V putIfAbsent(K key, Supplier<V> supplier) {
V value = this.get(key);
if(value == null) {
this.put(key, value = supplier.get());
}
return value;
}
}
现在我的问题是: 还有其他(更简单的)方法吗?或者我只是忽略了JavaAPI中的一些东西
# 1 楼答案
ComputeFabSent不是对putIfAbsent的1:1替换,因为返回值的约束不匹配。创建新条目时,putIfAbsent返回null,computeIfAbsent始终返回指定的值
上面建议的默认实现是调用get,然后调用put,但它需要在映射中进行两次查找,这破坏了性能就地替换的想法
# 2 楼答案
你不是想要什么吗
实现类似于:
因此,这并不完全是您发布的
Supplier<V>
签名,而是接近于此。在映射函数中使用key作为参数显然是有意义的