【发布时间】:2017-10-31 17:22:50
【问题描述】:
我正在尝试理解我在 Streams 文档中发现的警告。我已经养成了使用 forEach() 作为通用迭代器的习惯。这导致我编写这种类型的代码:
public class FooCache {
private static Map<Integer, Integer> sortOrderCache = new ConcurrentHashMap<>();
private static Map<Integer, String> codeNameCache = new ConcurrentHashMap<>();
public static void populateCache() {
List<Foo> myThings = getThings();
myThings.forEach(thing -> {
sortOrderCache.put(thing.getId(), thing.getSortOrder());
codeNameCache.put(thing.getId(), thing.getCodeName())
});
}
}
这是一个简单的例子。我了解此代码违反了 Oracle 对有状态 lamdas 和副作用的警告。但我不明白为什么会出现这个警告。
运行此代码时,它的行为似乎符合预期。那么我该如何打破它来证明为什么这是一个坏主意呢?
总的来说,我读到了这个:
如果并行执行,ArrayList 的非线程安全性将 导致不正确的结果,并且添加所需的同步会导致 争用,破坏了并行性的好处。
但是任何人都可以澄清一下以帮助我理解警告吗?
【问题讨论】:
-
你能提供警告吗?
-
您的示例中没有流。
-
有一个终端流操作叫
forEach(),但是你连流都没有。你打电话给List.forEach()。 -
我不知道您所说的“别名”是什么意思,但不知道。这是一种无关的方法。事实上,它是由
Iterable接口声明的,它甚至没有流方法。
标签: java java-stream