对于以下代码,
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()方法
答案 0 :(得分:3)
mInputList.forEach()
接受Consumer<? super String> action
参数,其中String
是mInputList
List
的元素类型。
因此,您可以将外部lambda表达式视为实现Consumer
接口的匿名类实例,因此具有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)
确实返回一个值,但它被忽略了。)