如何将TimerTask与lambdas一起使用?

2022-09-01 19:27:15

如您所知,您可以在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

所以我的问题:在构造时,有没有办法使用lambdas?TimerTask

我想要的是以下内容:

Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);

而不是一些丑陋的匿名内部类,有没有办法让它变得更好?


答案 1

首先要注意,这实际上是一个过时的API,但是为了解决您的问题,您可以围绕它编写一个小的包装器,该包装器将调整该方法以接受,并且在内部,您将将其转换为.然后,您将拥有接受lambda的方法。TimerscheduleRunnableRunnableTimerTaskschedule

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;
  }
}

答案 2

要完成 Marko Topolnik 关于 的答案,您只需要使用 lambda 调用方法。Timerschedule

schedule(() -> {
    System.out.println("Task #1 is running");
}, 500);

推荐