使计时器作为lambda执行

时间:2016-05-09 14:33:57

标签: java lambda timer

我在下面有以下定时器代码,但想写的是lambda表达式。

    private void setupPollingTimmer() {
        timer.scheduleAtFixedRate(new DownloadMessagesAndDisplayTask(), TIMERPERIOD,TIMERPERIOD);
    }

    private class DownloadMessagesAndDisplayTask extends TimerTask {
        public void run() {
            DownloadMessagesAndDisplay();
//            timer.cancel(); //Not necessary because we call System.exit
        }
    }

我环顾谷歌甚至试过() - >但它不喜欢它。

此外,如果有更好的Timer版本我应该使用,请说出来。

注意:假设的副本不重复,因为其勾选的答案不使用lambda表达式。 我在下面勾选了正确的答案。

1 个答案:

答案 0 :(得分:2)

不幸的是,java 8设计者决定不支持SAM抽象类,只支持接口。由于TimerTask是抽象类,因此不能直接使用lambda。

您可以实现自己的变体(MyTask),接受Runnable作为参数,实现run()方法以在传递的Runnable上调用run然后调度new MyTask(()-> DownloadMessagesAndDisplay());

或者,考虑一种java方言(groovy,xtend,koitlin),它允许使用带有SAM抽象类的闭包/ lambdas语法。