相关疑难解决方法(0)

Java 8 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())
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子。我了解该代码违反了Oracle关于有状态lamda和副作用的警告。但是我不明白为什么这个警告存在。

运行此代码时,它似乎表现出预期的效果。那么,我如何打破这一点来说明为什么这是一个坏主意?

在某种程度上,我读到以下内容:

如果并行执行,则ArrayList的非线程安全性将导致错误的结果,而添加所需的同步将导致争用,从而削弱了并行性的优势。

但是,谁能增加清晰度以帮助我理解警告?

java java-stream

7
推荐指数
1
解决办法
2771
查看次数

标签 统计

java ×1

java-stream ×1