当前位置: 首页 > 面试题库 >

如何在Lambda上使用TimerTask?

张财
2023-03-14
问题内容

如您所愿,您可以在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上运行时遇到了其他问题。 问题答案: 这是一个简单过程的完整代码示例,以形式启动 。 它也可以在github上找到。 index.js phantom-script.js 要获取可与Amazon Linux机器一起使用的Phant

  • 问题内容: 我有以下代码: 如您所见,期望使用lambda表达式。 现在,我正在使用Java库,但是该应用程序是用Scala编写的。如何将Scala lambda传递给Java代码? 我尝试了以下方法: 但是编译器抱怨: 问题答案: 错误消息列出了支持的参数类型。其中之一是: 从错误消息中,您可以看到您提供了以下类型: 根据Kafka 1 javadoc (在Kafka 1.1中不存在),定义为:

  • 问题内容: 我发现一个有4年历史的项目应该在lambda上安装phantomjs,但是我做错了什么,或者自从创建回购以来事情已经发生了变化,并且不再起作用。克隆并部署此存储库时,尝试运行phantomjs时出现此错误: 如果我使用最新的linux二进制文件而不是此仓库附带的二进制文件,则会收到有关另一个.so文件丢失的不同但相似的错误。 对于上下文,我要安装phantomjs的原因是因为我想在我的

  • 本文向大家介绍在Java中如何使用lambda实现LongUnaryOperator?,包括了在Java中如何使用lambda实现LongUnaryOperator?的使用技巧和注意事项,需要的朋友参考一下 LongUnaryOperator是一个java.util.function函数接口。此函数接口接受单个长值操作数并生成长值结果。LongUnaryOperator接口可以用作lambda表达

  • 我在尝试使用lambda表达式时遇到了这个错误。

  • 我使用Amazon模板使用C#Dotnet3.1创建了一个AWS Lambda解决方案 这将创建一个lambda函数,其处理程序为以及一些文件和 部署它的标准方法是安装 然后运行 请注意,配置文件是可选的,但我在该配置文件下配置了AWS。这将提示输入CloudFormation堆栈名称(例如:foo)和S3 bucket(例如:my-bucket)并将其部署到自定义配置文件下配置的“真实”AWS