如您所愿,您可以在 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
是一个函数式接口(interface),只有一个(抽象的)公共(public)非默认方法。
但是...对于 TimerTask
我们有以下内容:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
看起来很眼熟吧?
但是使用 lambda 表达式不起作用,因为 TimerTask
是一个抽象类,即使它只有一个抽象的公共(public)非默认方法,它也不是一个接口(interface),因此也没有功能接口(interface)。
它也没有被重构为具有默认实现的接口(interface),因为它带有状态,因此无法做到。
所以我的问题:在构造 TimerTask
时有没有办法使用 lambda?
我想要的是以下内容:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
除了一些丑陋的匿名内部类之外,有什么方法可以让它变得更好吗?
最佳答案
首先注意到 Timer
实际上是一个过时的 API,但尽管如此,您的问题还是很有趣,您可以围绕它编写一个小包装器,该包装器将调整 schedule
方法以接受Runnable
,在里面你可以把那个Runnable
变成一个TimerTask
。然后你就会有你的 schedule
方法,它会接受一个 lambda。
public class MyTimer {
private final Timer t = new Timer();
public TimerTask schedule(final Runnable r, long delay) {
final TimerTask task = new TimerTask() { public void run() { r.run(); }};
t.schedule(task, delay);
return task;
}
}
关于java - 如何将 TimerTask 与 lambda 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22378422/