使用Intstream生成无限的Fibonacci序列

Dfl*_*240 4 java int fibonacci

我有一个小问题,弄清楚如何使用流来生成无限大小的顺序流,其中包含斐波那契序列中的所有数字.

我怎么能打印出无限的流?任何建议都有帮助,谢谢.

JB *_*zet 8

public class Fibonacci {

    public static void main(String[] args) {
        IntStream stream = IntStream.generate(new FibonacciSupplier());
        stream.limit(20).forEach(System.out::println);
    }

    private static class FibonacciSupplier implements IntSupplier {

        int current = 1;
        int previous = 0;

        @Override
        public int getAsInt() {
            int result = current;
            current = previous + current;
            previous = result;
            return result;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但请注意,一旦到达第47个元素,此流不能是无限的,该值太大而无法放入正整数.

  • 如果我这样做,你就不会像你问的那样拥有无限的流.你只需要7个值的流. (2认同)

spr*_*ter 5

您可能认为有一种使用map操作来生成序列的方法。没有:Java 非终端操作按照设计,一次只能对一个元素进行操作。这允许将它们转换为具有确定性结果的并行流。

您最好的选择是生成无限流。这里有几种方法可以做到这一点:

class Fib {
    private int previous = 0;
    private int current = 1;

    private int next() {
        int temp = previous + current;
        previous = current;
        current = temp;
        return current;
    }

    public IntStream stream() {
        return IntStream.generate(this::next);
    }
}
Run Code Online (Sandbox Code Playgroud)

用作new Fib().stream().

您也可以仅使用数组来执行此操作:

IntStream fibStream = Stream.iterate(new int[]{0, 1}, a -> new int[]{a[1], a[0]+a[1]}).mapToInt(a -> a[1])
// print first 20 fibonacci number
fibStream.limit(20).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)