如何在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

回到顶部