正如您所希望的那樣,您可以使用Java 8中的lambdas來替換匿名方法。如何將lambda使用TimerTask?
的例子可以在這裏的Java 7中看到的和Java 8:
Runnable runnable = new Runnable() {
@Override
public void run() {
checkDirectory();
}
};
可表現爲無論是在Java的8以下幾種方式:
Runnable runnable =() -> checkDirectory();
或
Runnable runnable = this::checkDirectory;
這是因爲Runnable
是一個功能接口,只有一個(抽象)公共非默認我的ThOD。
但是......對於TimerTask
,我們有以下幾點:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
看起來很熟悉吧?
雖然使用lambda表達式不起作用,因爲TimerTask
是一個抽象類,儘管它只有一個抽象的公共非默認方法,但它不是一個接口,因此也沒有功能接口。
它也不會被重構到默認實現的接口中,因爲它帶有狀態,所以當時無法完成。
所以我的問題:有什麼辦法可以在構建TimerTask
時使用lambdas?
我想要的東西是這樣的:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
相反一些醜陋的匿名內部類的,有沒有什麼辦法讓它更好?
由於您使用的現代功能,爲什麼不走一路並使用'ScheduledExecutorService'而不是'TimerTask'? ;) – fge
@fge那麼,我不知道它的存在,直到現在......現在我想起來了,Java沒有他們的API提到有一個更新的類似功能可用,當舊功能尚未*推薦*? – skiwi
對於Timer,Josh Bloch的Effective Java 2nd Edition建議。不過,它並不是JDK API的官方位置。 –