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

时间:2017-11-13 07:17:59

标签: 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()方法

1 个答案:

答案 0 :(得分:3)

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

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

现在,forEachaccept方法应用于mInputList的每个元素。

代码中accept方法的实现如下所示:

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

现在您可以看到input的来源。

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