【问题标题】:Lambda Schedule to println from a ArrayListLambda 计划从 ArrayList 进行 println
【发布时间】:2017-09-03 03:33:40
【问题描述】:

我正在尝试创建一个计时器以按计划从 ArrayList 中打印出来。但我收到此错误:

Cannot resolve method 'schedule(<lambda expression>,int,java.util.concurret.TimeUnit)'

为什么我会收到此错误,我该怎么办?

List<String> finalQuestionsList = questionsList;
timer.schedule(()-> finalQuestionsList.forEach(write::println),120, TimeUnit.SECONDS); 

【问题讨论】:

标签: lambda timer java-8 scheduled-tasks


【解决方案1】:

JLS 断言 lambda 表达式的类型:

如果 T 是函数式接口类型(第 9.8 节)并且表达式与派生的基本目标类型的函数类型一致,则 lambda 表达式在赋值上下文、调用上下文或转换上下文中与目标类型 T 兼容来自T。

  1. TimerTask 不是 Function Interface,因此您不能将 lambda 表达式分配给 TimerTask。但是您可以使用适配器方法 task 将 Runnable 适配到 TimerTask。

  2. Timer.schedule 方法不能采用 TimeUnit,但您可以使用 TimeUnit.toMills() 将持续时间转换为毫秒。

  3. 我在你的代码 sn-p 中看不到任何 write 变量,所以我改用 System.out

    List<String> finalQuestionsList = questionsList;
    timer.schedule(task(() -> finalQuestionsList.forEach(System.out::println))
             , 120, TimeUnit.SECONDS.toMillis(1));
    
    private TimerTask task(Runnable task) {
        return new TimerTask() {
          @Override
          public void run() {
            task.run();
          }
        };
    }
    

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2021-06-11
    • 2023-03-14
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2018-04-27
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多