考虑到我有以下课程:
public class Problem2 extends Problem<Integer> {
@Override
public void run() {
result = toList(new FibSupplier(i -> (i <= 4_000_000)))
.stream()
.filter(i -> (i % 2 == 0))
.mapToInt(i -> i)
.sum();
}
@Override
public String getName() {
return "Problem 2";
}
private static <E> List<E> toList(final Iterator<E> iterator) {
List<E> list = new ArrayList<>();
while (iterator.hasNext()) {
list.add(iterator.next());
}
return list;
}
private class FibSupplier implements Iterator<Integer> {
private final IntPredicate hasNextPredicate;
private int beforePrevious = 0;
private int previous = 1;
public FibSupplier(final IntPredicate hasNextPredicate) {
this.hasNextPredicate = hasNextPredicate;
}
@Override
public boolean hasNext() {
return hasNextPredicate.test(previous);
}
@Override
public Integer next() {
int result = beforePrevious + previous;
beforePrevious = previous;
previous = result;
return result;
}
}
}
如果你看一下FibSupplier
你会发现它暴露了一个普遍的问题,即使它在这里有一个专门的实现,我设法提取的是:
- 它有一个
Predicate
. - 它具有初始变量。
- 它有一个需要由谓词测试的变量。
- 它有一个自定义
next()
方法。
我尝试通过以下方式来概括这一点,请注意,我现在使用通用版本而不是专用整数版本:
public class FiniteSupplier<E> implements Iterator<E> {
private final Predicate<E> predicate;
public FiniteSupplier(final Predicate<E> predicate) {
this.predicate = predicate;
}
@Override
public boolean hasNext() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public E next() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
我希望能够FiniteSupplier
用 a调用predicate
,但是现在我真的不知道如何实现我设法提取的其他要求。我知道可以通过扩展FiniteSupplier
和使其抽象来完成,但这是正确的方法吗?