每当我尝试运行以下代码时,它都会引发UnsupportedOperationException
但是,据我了解,它应该可以正常工作,因为我正在计算K
中已经存在的Map
的值
public class MyClass {
public static void main(String[] args) {
Collections.singletonMap("k", "v").computeIfAbsent("k", k -> "v" );
}
}
有人可以帮助我了解这种行为吗?
答案 0 :(得分:3)
Collections.singletonMap()
不会返回完全实现的Map
。
public static <K,V> Map<K,V> singletonMap(K key, V value) {
return new SingletonMap<>(key, value);
}
尝试更新地图的操作将抛出UnsupportedOperationException
(否则,返回的地图将不再是不变的)
答案 1 :(得分:3)
答案 2 :(得分:0)
Map Collections.singletonMap是不可变的,不支持put()。如果不存在,则计算是否将键和值放入地图(如果不存在)。
使用其他Map类型或仅使用get()。
答案 3 :(得分:0)
但是,据我了解,它在我计算时应该可以正常工作 Map中已经存在的K的值
使用Map
创建的singletonMap()
实例实际上不允许在地图中添加或删除条目。
但是,不变性已经超越了。这意味着无法更改对象的整个状态。因此,无论您尝试哪种方式,都不允许更新现有条目(即使具有与示例中相同的值):
Collections.singletonMap("k", "v").computeIfAbsent("k", k -> "v" );
实际上,SingletonMap
实例唯一受支持的方法是检索方法:get()
,entrySet()
,因此...对于……以及任何返回Map条目的受支持方法都将返回防御性复制它们,就像任何不可变的类都应该做的那样。
另外,请注意public static singletonXXX()
中的所有java.util.Collections
方法(singleton()
,singletonList()
和singletonMap()
)都返回不可变的实例。