如何在Lambda上使用TimerTask?
如您所愿,您可以在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
是一个抽象类,即使它只有一个抽象的公共非默认方法,它也不是接口,因此也不是功能性接口。
它也不会重构为具有默认实现的接口,因为它带有状态,因此不能这样做。
所以我的 是:在构造Lambda时有什么方法TimerTask
吗?
我想要的是以下内容:
Timer timer = new Timer();timer.schedule(this::checkDirectory, 0, 1 * 1000);
有什么办法可以使它变得更好呢?
回答:
首先请注意,这Timer
实际上是一种过时的API,但是仍然可以解决您的问题,您可以在它周围编写一个小的包装,使该schedule
方法可以接受a
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;
}
}
以上是 如何在Lambda上使用TimerTask? 的全部内容, 来源链接: utcz.com/qa/427421.html