У меня есть следующий класс:
public class CloseableRepeater<R extends Closeable> {
/**
* Repeats the supplier until the stop condition becomes <code>true</code>.
*
* @param supplier The supplier to be repeated.
* @param until The stop condition.
* @param times The maximum repeat times.
* @return The result.
*/
public Optional<R> repeat(Supplier<R> supplier, Predicate<R> until, int times) {
R r = null;
for (int i = 0; i < times; i++) {
r = supplier.get();
if (until.test(r)) {
break;
} else {
try {
r.close();
} catch (IOException e) {
// Ignore
}
}
}
return Optional.of(r);
}
}
По сути, он повторяет действие до тех пор, пока условие не выполнено, и закрывает элементы, которые его не выполняют.
Мой вопрос
Есть ли возможность переписать метод repeat
с помощью функционального программирования?
Я знаю, что код достаточно хорош, как есть, но Цель этого вопроса - улучшить мои навыки функционального программирования и найти его ограничения
Самое близкое, что у меня есть:
public Optional<R> repeat(Supplier<R> supplier, Predicate<R> until, int times) {
return IntStream.range(0, times).mapToObj(i -> supplier.get()).filter(until).findFirst();
}
, но часть close
отсутствует.