在JAVA 8中以lambda块同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JAVA 8中以lambda块同步相关的知识,希望对你有一定的参考价值。

可以将synchronized用于一些用lambda表达式块编写的代码块。关于以下代码段:

workflowTasks.forEach((workflowTask) -> {
        String taskName = workflowTask.getTaskName();
        if (profileNames.containsKey(taskName) || newSetDuplication.contains(taskName)) {
            errorMessages.append(taskName + ",");
        }
        newSetDuplication.add(taskName);
    });
答案

当然!您的代码块在逻辑上等效于以下内容,假设workFlowTask的类型为WorkFlowTask

for (WorkFlowTask workFlowTask : workFlowTasks) {
    String taskName = workflowTask.getTaskName();

    if (profileNames.containsKey(taskName) || newSetDuplication.contains(taskName)) {
        errorMessages.append(taskName + ",");
    }

    newSetDuplication.add(taskName);
}

显然,可以在这里使用synchronized关键字,尽管在使用之前还有许多其他事情要考虑,特别是在循环中。无论如何,你的forEach lambda只是Consumer<WorkFlowTask>的语法糖,你也可以使用synchronized

以上是关于在JAVA 8中以lambda块同步的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 lambda表达式示例

Lambda 表达式 in java 8

《Java 8 in Action》Chapter 2:通过行为参数化传递代码

2018.8.1 Java中的反射和同步详解

Java的synchronized的同步代码块和同步方法的区别

浅析Java 8中Lambda 表达式