【发布时间】:2018-10-23 03:29:23
【问题描述】:
查看 Java java.util.stream 包文档后,人们对在流使用中遵循的最佳实践产生了疑问。 考虑到这段代码:
HashMap<Integer,Integer> map = new HashMap<>();
map.put(1,1);
map.put(2,2);
map.put(3,3);
map.put(4,4);
map.keySet().parallelStream().forEach(key -> {
if (key == 3) {
map.put(3,0);
}
});
- 代码输出是否总是等于 ([1,1],[2,2],[3,0],[4,4])?
- 可以将 map.put(3,0) 视为非干扰操作吗?
- 可以将 map.put(3,0) 视为可接受的副作用吗?
换句话说,上述代码是否符合流文档中建议的最佳实践?
【问题讨论】:
-
如果可以多次破坏代码,那么您就做到了。您通过修改流的源来违反合同,并且通过从任意未知线程修改不是线程安全的
HashMap来违反合同。此外,您期望输出为[1,1],[2,2],[3,0],[4,4],尽管HashMap不保证任何订单,因此即使没有其他合同违规,您也不能认为结果是理所当然的。最后,您要问的是,是否与记录的约束相反“可以被认为符合最佳实践”……
标签: java java-stream