Как использовать TimerTask с лямбдами?
Как вы, наверное, знаете, вы можете использовать лямбды в Java 8, например, для замены анонимных методов.
Здесь можно увидеть пример 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();
}
};
Выглядит знакомо, правда?
Использование лямбда-выражения не работает, потому чтоTimerTask
является абстрактным классом, хотя у него есть только один абстрактный публичный метод не по умолчанию, он не является интерфейсом и, следовательно, не имеет функционального интерфейса.
Он также не реорганизован в интерфейс с реализациями по умолчанию, потому что он несет состояние, так что это не может быть сделано тогда.
Так что мойвопрос: Есть ли способ использовать лямбды при построенииTimerTask
?
То, что я хотел, это следующее:
Timer timer = new Timer();
timer.schedule(this::checkDirectory, 0, 1 * 1000);
Вместо какого-то уродливого анонимного внутреннего класса, есть ли способ сделать его лучше?