【发布时间】:2014-03-13 12:18:05
【问题描述】:
如您所知,您可以在 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? ;) -
@fge 好吧,我不知道它存在,直到现在......现在我想,Java 没有他们的 API 提到有一个更新的类似功能可用功能尚未弃用?
-
对于
Timer,Josh Bloch 的 Effective Java 2nd Edition 建议这样做。不过,这不是 JDK API 的官方立场。 -
呃,不......这无疑是他们的文档中的一大缺陷。同样,他们在
File文档中也没有提及Files;
标签: java lambda abstract-class timertask java-8