gpt4 book ai didi

java - 顺序流和共享状态

转载 作者:行者123 更新时间:2023-11-29 05:02:06 24 4
gpt4 key购买 nike

javadoc for java.util.stream意味着流管道中的“行为操作”通常必须是无状态的。然而,它展示的如何不写管道的例子似乎都涉及并行流。

这在多大程度上适用于顺序流?

特别是,我正在查看一位同事的代码,它看起来基本上是这样的:

List<SomeClass> list = ...;
Map<SomeClass, String> map = new HashMap<>();
list.stream()
.filter(x -> [some boolean expression])
.forEach(x -> {
if (map.containsKey(x) {
throw new UserDefinedException("duplicates detected in input");
} else {
map.put(x, aStringFunction(x));
}
});

[作者曾尝试使用Collectors.toMap(),但是当出现重复时它抛出了一个IllegalStateException,而且我们都不知道toMap 接受一个 mergeFunction。最后一个将是最好的解决方案,但由于涉及更一般的原则,我还是想要一个答案。]

我对这段代码感到紧张,因为我不清楚 forEach 中的 block 的执行是否可以针对不同的元素重叠,即使对于顺序流也是如此。 javadoc for forEach()对于访问顺序流中的共享状态是否需要同步有点模糊。最终,作者更改了代码以使用 ConcurrentHashMapmap.putIfAbsent()

我的问题是:我紧张是对的,还是上面的代码值得信赖?

假设 filter() 中的表达式做了一些使用共享状态的事情。我们可以相信它在使用顺序流时会正常工作吗?

最佳答案

根据定义,顺序流在调用者线程中执行所有内容,因此如果您将来不打算并行化您的流,您可以安全地使用共享状态,而无需额外的同步和并发安全的集合。所以当前代码是安全的。但请注意,它看起来很脏。

关于java - 顺序流和共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31767697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com