我试图理解在“流文档”中发现的警告。我已经习惯了使用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())
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子。我了解该代码违反了Oracle关于有状态lamda和副作用的警告。但是我不明白为什么这个警告存在。
运行此代码时,它似乎表现出预期的效果。那么,我如何打破这一点来说明为什么这是一个坏主意?
在某种程度上,我读到以下内容:
如果并行执行,则ArrayList的非线程安全性将导致错误的结果,而添加所需的同步将导致争用,从而削弱了并行性的优势。
但是,谁能增加清晰度以帮助我理解警告?