multithreading - 如何可视化嵌套的 lambda 语法?

标签 multithreading lambda java-8

对于下面的代码,

public class X{
    ...
    static class Y implements Runnable{
     .....
         List<Thread> makeWorkerThreads(Function<String, Void> task) {
             List<Thread> workerThreads  =  new ArrayList<>();
             mInputList.forEach(input -> workerThreads.add
                            (new Thread( 
                                    () -> task.apply(input)
                                    )));
             return workerThreads;
         }
         ....
    } // Y
    ....
} // X

在哪里 task
private Void processInput(String input) {
        ...
}

无法理解以下语法,
mInputList.forEach(input -> workerThreads.add
                            (new Thread(
                                        () -> task.apply(input)
                                       )
                            )
                    );

如何task.apply(input)解析名称 input在被覆盖 run()方法?
无法可视化 run() 方法

最佳答案

mInputList.forEach()接受 Consumer<? super String> action参数,其中 String是您的 mInputList 的元素类型List .

因此,您可以将外部 lambda 表达式视为实现 Consumer 的匿名类实例。接口(interface),因此具有 void accept(String t);方法。

现在,forEach适用 accept mInputList 的每个元素的方法.
accept的执行代码中的方法如下所示:

void accept (String input) {
    workerThreads.add (new Thread(() -> task.apply(input)));
}

现在你可以看到input来自。

内部 lambda 表达式 () -> task.apply(input)实现 Runnable界面。即它实现了一个不带参数的方法(因此是 () 部分)并且什么都不返回(在这种情况下 task.apply(input) 确实返回一个值,但它被忽略了)。

关于multithreading - 如何可视化嵌套的 lambda 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47258918/

相关文章:

multithreading - C++ 11何时使用内存围栏?

java - Stream<Set<Path>> 到 Set<Path>

node.js - AWS Lambda 随机超时

Java 8 Streams - 按父属性分组

java - Java-8 给定范围内的质数

Java 在终止之前等待所有线程

c++ - 使用多线程时 Qt Creator 崩溃

node.js - 如何在 Lambda 函数中使用 AWS.CloudFront.Signer

java - 使用 JFileChooser 允许 Swing 用户指定输出位置

c++ - 在 API 和应用程序线程之间共享数据