Как использовать TimerTask с лямбда-выражениями? ⇐ JAVA
Как использовать TimerTask с лямбда-выражениями?
Как вы, надеюсь, знаете, в Java 8 можно использовать лямбда-выражения, например, для замены анонимных методов.
Здесь можно увидеть пример Java 7 и Java 8:
Runnable runnable = новый Runnable() { @Override общественный недействительный запуск () { проверитьКаталог(); } }; В Java 8 может быть выражено обоими следующими способами:
Runnable runnable = () -> checkDirectory(); или
Runnable runnable = this::checkDirectory; Это связано с тем, что Runnable — это функциональный интерфейс, имеющий только один (абстрактный) общедоступный метод, отличный от стандартного.
Однако... Для TimerTask у нас есть следующее:
TimerTask timerTask = новый TimerTask() { @Override общественный недействительный запуск () { проверитьКаталог(); } }; Выглядит знакомо, правда?
Однако использование лямбда-выражения не работает, поскольку TimerTask является абстрактным классом, хотя он имеет только один абстрактный общедоступный метод, отличный от стандартного, он не является интерфейсом и, следовательно, не является функциональным интерфейсом.
Он также не подвергается рефакторингу в интерфейс с реализациями по умолчанию, поскольку он переносит состояние, поэтому в этом случае это невозможно сделать.
Итак, мой вопрос: есть ли способ использовать лямбда-выражения при создании TimerTask?
Я хотел следующего:
Таймер timer = новый таймер(); timer.schedule(this::checkDirectory, 0, 1 * 1000); Вместо какого-то уродливого анонимного внутреннего класса, есть ли способ сделать его лучше?
Как вы, надеюсь, знаете, в Java 8 можно использовать лямбда-выражения, например, для замены анонимных методов.
Здесь можно увидеть пример Java 7 и Java 8:
Runnable runnable = новый Runnable() { @Override общественный недействительный запуск () { проверитьКаталог(); } }; В Java 8 может быть выражено обоими следующими способами:
Runnable runnable = () -> checkDirectory(); или
Runnable runnable = this::checkDirectory; Это связано с тем, что Runnable — это функциональный интерфейс, имеющий только один (абстрактный) общедоступный метод, отличный от стандартного.
Однако... Для TimerTask у нас есть следующее:
TimerTask timerTask = новый TimerTask() { @Override общественный недействительный запуск () { проверитьКаталог(); } }; Выглядит знакомо, правда?
Однако использование лямбда-выражения не работает, поскольку TimerTask является абстрактным классом, хотя он имеет только один абстрактный общедоступный метод, отличный от стандартного, он не является интерфейсом и, следовательно, не является функциональным интерфейсом.
Он также не подвергается рефакторингу в интерфейс с реализациями по умолчанию, поскольку он переносит состояние, поэтому в этом случае это невозможно сделать.
Итак, мой вопрос: есть ли способ использовать лямбда-выражения при создании TimerTask?
Я хотел следующего:
Таймер timer = новый таймер(); timer.schedule(this::checkDirectory, 0, 1 * 1000); Вместо какого-то уродливого анонимного внутреннего класса, есть ли способ сделать его лучше?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Локальные функции с лямбда-выражениями – помещать их внутри или снаружи цикла for?
Anonymous » » в форуме C++ - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Почему я не могу использовать микшины с выражениями класса в TypeScript
Anonymous » » в форуме Javascript - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-