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