使用Intstream生成无限斐波那契数列
Using Intstream to generate infinite Fibonacci sequence
我在弄清楚如何使用流生成无限大小的顺序流时遇到了一个小问题,该流包含斐波那契数列中的所有数字。
我怎样才能打印出无限流?任何建议都有帮助,谢谢。
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;
}
}
}
但是请注意,一旦到达第 47 个元素,此流就不能无限,该值太大而无法放入正整数。
您可能认为有一种方法可以使用 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);
}
}
用作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);
我在弄清楚如何使用流生成无限大小的顺序流时遇到了一个小问题,该流包含斐波那契数列中的所有数字。
我怎样才能打印出无限流?任何建议都有帮助,谢谢。
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;
}
}
}
但是请注意,一旦到达第 47 个元素,此流就不能无限,该值太大而无法放入正整数。
您可能认为有一种方法可以使用 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);
}
}
用作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);