在这个问题中,我需要编写一个 findMatch 方法,该方法接受一个“流”(IFL 旨在模仿流)并找到通过谓词的流的第一个元素。我的尝试如下:
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)