剛剛發現了一個奇怪而有趣的Lambda行爲。Lambda:使用Runnable實例啓動的可調用變量
讓我們有下面的類:
private class Task implements Runnable {
@Override
public void run() {
// something to process
}
}
下面的語句是編譯和運行:
Callable task = Task::new;
有人能解釋爲什麼這是可能的嗎?
編輯:
基於下面的回答,請檢查下面的語句:
1.
ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(Task::new);
2.
ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(new Task());
乍一看,看起來是一樣的,但實際上做了一個完全不同的事情。
這裏發生的事情正是上述情況。
的原因是ExecutorService
有兩種方法:
submit(Runnable); submit(Callable);
因此,使用代碼從1執行人將處理以下關於它的內螺紋:
new Task()
2.版本實際上將調用submit(Runnable)
方法,並且Task.run
中的代碼將被執行。
結論:只要小心使用Lambda表達式:)
它被稱爲[方法參考](https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html) –
當不使用*原始類型*:'Callable任務時變得更清晰= Task :: new;'或'Callable task = Task :: new;' –
Holger
Holger,我認爲在這種情況下並不重要。最終結果是一樣的。 –