希望您已经知道在Java 8中可以使用lambda表达式,例如用它来替代匿名方法。
这里可以看到Java 7和Java 8的一个例子:
Runnable runnable = new Runnable() {
@Override
public void run() {
checkDirectory();
}
};
在Java 8中可以用以下两种方式表达:
Runnable runnable = () -> checkDirectory();
或者Runnable runnable = this::checkDirectory;
这是因为Runnable
是一个函数式接口,只有一个(抽象的)公共非默认方法。
然而...... 对于TimerTask
,我们有以下内容:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
看起来很熟悉,对吗?
然而,使用lambda表达式是行不通的,因为TimerTask
是一个抽象类,尽管它只有一个抽象的公共非默认方法,但它不是一个接口,因此也不是函数式接口。
另外,它也无法被重构为带有默认实现的接口,因为它带有状态,那样做是不可行的。
所以我的问题: 是否有任何方法在构建TimerTask
时使用lambda表达式?
我想要的是以下内容:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
有没有什么方法可以让它更美观,而不是使用一些丑陋的匿名内部类呢?
ScheduledExecutorService
而不是TimerTask
? ;) - fgeTimer
的情况下,Josh Bloch的《Effective Java第二版》建议如下。尽管如此,这并不是JDK API的官方立场。 - Marko Topolnik