次のクラスがあるとします。
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
で呼び出すことができるようにしたいのですpredicate
が、抽出できた他の要件を実装する方法がよくわかりません。を拡張して抽象化することでできることは理解していFiniteSupplier
ますが、それは正しい方法ですか?