В этом вопросе мне необходимо написать метод findMatch, который принимает «поток» (IFL предназначен для имитации c потока) и находит первый элемент потока, который передает предикат. Моя попытка заключается в следующем:
import java.util.function.Predicate;
import java.util.Optional;
import java.util.ArrayList;
import java.util.List;
class IFL<T> {
Supplier<T> head;
Supplier<IFL<T>> tail;
IFL(Supplier<T> head, Supplier<IFL<T>> tail) {
this.head = head;
this.tail = tail;
}
static <T> IFL<T> of(List<? extends T> list) {
return new IFL<T>(
() -> list.get(0),
() -> IFL.of(list.subList(1, list.size()))) {
};
}
Optional<T> findMatch(Predicate<? super T> predicate) {
if (predicate.test(head.get())) {
return Optional.of(this.head.get());
} else {
if (this.tail.get().findMatch(predicate).isPresent()) {
return this.tail.get().findMatch(predicate);
}
return Optional.empty();
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что блок else
в моем методе findMatch, похоже, выполняет только оператор return
вместо рекурсивного вызова самого себя, как я полагаю, что это должно , Есть ли в любом случае, чтобы убедиться, что он делает?
Обновление: я получил код для работы для второй строки ввода. Однако выполнение третьей строки ввода приводит к IndexOutOfBoundsException
в jshell.
Ввод выглядит следующим образом
IFL<String> list = IFL.of(Arrays.asList("three", "little", "pigs"))
list.findMatch(str -> str.length() == 6)
list.findMatch(str -> str.length() < 4)