3 回答
TA贡献1777条经验 获得超10个赞
不不不。
避免副作用。
符合文档的示例代码:
Map<Integer,Integer> updatedMap = map.keySet().parallelStream()
.filter(e -> e == 3)
.collect(Collectors.toMap(Function.identity(), e -> 0));
map.putAll(updatedMap);
TA贡献1936条经验 获得超6个赞
比较(一)
map.keySet().parallelStream().forEach(key -> {
if (key == 3) {
map.put(3, 0);
}
});
(添加了一个新条目)
与 (b)
map.entrySet().parallelStream().forEach(e -> {
if (e.getKey() == 3) {
e.setValue(0);
}
});
(没有创建、移动 Entry 对象。但要注意LinkedHashMap
.)
(a) 不安全
(b) 安全
代码输出是否总是等于 ([1,1],[2,2],[3,0],[4,4])?
(a) 否 (b) 是
可以
map.put(3, 0)
认为是非干扰操作吗?(a) 否 (b)
setValue(0)
是可以
map.put(3, 0)
认为是可以接受的副作用吗?(a) 否 (b)
setValue(0)
是
所以(a)是邪恶的,(b)是好的。
为什么要提到 entrySet.setValue?
实际上 HashMap.put
在 Oracle实现中可能与Entry.setValue
. 这将需要使用实现知识 - 丑陋。
而 Entry.setValue 基于原始地图的支持,人们可能会推断出只有 value 字段被覆盖。请注意, aLinkedHashMap
需要对条目重新排序,而重新排序又是不安全的。
添加回答
举报