java - 如何将 TimerTask 与 lambda 一起使用?

标签 java lambda abstract-class timertask java-8

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

相关文章:

java - 在 Swing 中获取当前外观组件背景颜色的正确方法是什么?

java - Stream#reduce() 的 System.out.println() 意外在结果周围打印 "Optional[]"

C++ lambda 返回类型不是预期的

c# - 有没有办法让抽象类中的静态只读字段在派生类中实例化?

python - 使用接口(interface)/抽象基类是pythonic吗?

java - String 是如何调用构造函数的?

java - java中>>>是什么意思

Linq - 'Saving' OrderBy 操作 (c#)

java - 简化抽象类的多个继承类(内容全部相同)

Bluemix 中的 Java DB Web 启动程序