Как вы, надеюсь, знаете, в Java 8 можно использовать лямбда-выражения, например, для замены анонимных методов.
Здесь можно увидеть пример Java 7 и Java 8:
Runnable runnable = new Runnable() {
@Override
public void run() {
checkDirectory();
}
};
В Java 8 можно выразить двумя способами:
Runnable runnable = () -> checkDirectory();
or
Runnable runnable = this::checkDirectory;
Это связано с тем, что Runnable
является функциональным интерфейсом, имеющим только один (абстрактный) общедоступный метод не по умолчанию.
Однако... Для TimerTask
имеем следующее:
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
checkDirectory();
}
};
Выглядит знакомо, правда?
Однако использование лямбда-выражения не работает, поскольку TimerTask
является абстрактным классом, хотя у него есть только один абстрактный общедоступный метод не по умолчанию, он не является интерфейсом и, следовательно, не является функциональным интерфейсом.< br> Он также не рефакторинг в интерфейс с реализациями по умолчанию, потому что он несет состояние, так что тогда это невозможно сделать.
Итак, мой вопрос: есть ли способ использовать лямбда-выражения при построении TimerTask
?
Я хотел следующее:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
Вместо какого-то уродливого анонимного внутреннего класса, есть ли способ сделать его лучше?
ScheduledExecutorService
вместоTimerTask
? ;) - person fge   schedule 13.03.2014Timer
это рекомендуется в книге Джоша Блоха «Эффективная Java 2nd Edition». Однако это не официальная позиция JDK API. - person Marko Topolnik   schedule 13.03.2014Files
в документеFile
; - person fge   schedule 13.03.2014