私が作った次のクラスを見る:
public class FibonacciSupplier implements Iterator<Integer> {
private final IntPredicate hasNextPredicate;
private int beforePrevious = 0;
private int previous = 1;
private FibonacciSupplier(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;
}
public static FibonacciSupplier infinite() {
return new FibonacciSupplier(i -> true);
}
public static FibonacciSupplier finite(final IntPredicate predicate) {
return new FibonacciSupplier(predicate);
}
}
そして、それを次のように使用します。
public class Problem2 extends Problem<Integer> {
@Override
public void run() {
result = toList(FibonacciSupplier.finite(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;
}
}
どうすれば無限 を作成できますStream<E>
か?
を使用するStream<Integer> infiniteStream = toList(FibonacciSupplier.infinite()).stream()
と、おそらく驚くべきことに、無限ストリームを取得することはありません。
代わりに、コードはlist
基になるメソッドでの作成で永遠にループします。
これまでのところ、これは純粋に理論的なものですが、最初に無限ストリームから最初の x 個の数字をスキップしてから、最後の y 個の数字で制限したい場合、その必要性を明確に理解できます。たとえば、次のようになります。
int x = MAGIC_NUMBER_X;
int y = MAGIC_NUMBER_y;
int sum = toList(FibonacciSupplier.infinite())
.stream()
.skip(x)
.limit(y)
.mapToInt(i -> i)
.sum();
コードが結果を返すことはありません。どうすればよいですか?