这段代码使用Java 8 Lambdas是线程安全的吗-stream.forEach

时间:2019-03-22 21:03:16

标签: java lambda foreach race-condition

假设我有一个书元素列表:List<Book> libraryBooks和以下代码:

List<BookAuthor> authors = new ArrayList<>();
libraryBooks.stream().forEach(e -> {
                                     authors.add(createAuthor(e));
                                   });

我环顾四周,发现了类似的问题(例如here),但我尚未说服。因为我一直在阅读有关该主题的书,并且该书似乎表明如果并行运行流,则以上内容可能会引入竞争条件-但我未使用并行流,因此上述内容也受竞争条件的影响?还是这本书是错误的/误导性的?

这是我指的那本书的摘录: enter image description here

1 个答案:

答案 0 :(得分:0)

当您需要通过对每个元素应用函数来创建新的项目列表时,map是您应使用的函数。这是你应该怎么写的:

List<BookAuthor> authors = libraryBooks.stream()
            .map(e -> createAuthor(e))
            .collect(Collectors.toList());