Как можно Runnable
преобразовать в Supplier
?
public <T> T useSupplier(Supplier<T> supplier) {
// Does something with supplier and returns supplied value
...
return value;
}
public void useRunnable(Runnable runnable) {
// Somehow convert runnable to Supplier
...
useSupplier(supplier);
}
Здесь я хотел бы повторно использовать метод useSupplier
для useRunnable
, например, потому что я не хочупродублируйте кодПоведение useSupplier
не имеет значения для этого вопроса, скажем, оно оборачивает выброшенные исключения или использует поставщика в синхронизированном блоке.
Редактировать: Чтобы уточнить, метод useSupplier
не имеетвзаимодействовать с предоставленным значением, оно просто возвращает его.Функциональность useSupplier
заключается в получении значения от поставщика в некотором контексте, в моем случае он ловит (специфический) RuntimeException
s, создает новое исключение с ним как причину и выдает его:
public <T> T useSupplier(Supplier<T> supplier) {
try {
return supplier.get();
}
catch (RuntimeException runtimeException) {
throw new MyException("Supplier threw exception", runtimeException);
}
}
Следующие решения не работают (в Java 8):
useSupplier(runnable);
useSupplier(runnable::run);
useSupplier((Supplier<Void>) runnable::run);
Одно из решений, которое я мог бы предложить, - это создать новый Supplier
, который возвращает произвольныйзначение:
useSupplier(() -> {
runnable.run();
return null;
});
Есть ли меньшее решение?
Редактировать: Как отметил Хольгер в комментариях, использование runnable::run
также создаст новые экземпляры лямбда-выражений, так как это состояние с состоянием, см.также этот ответ .