用jdk8的stream来实现斐波那契数列
Posted lifacheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用jdk8的stream来实现斐波那契数列相关的知识,希望对你有一定的参考价值。
1. 为什么
jdk8用着越来越舒服,各种API, 一顿操作,代码从上到下一气呵成,爽! 突然想到,怎么用stream来实现斐波那契数列?
2. 说干就干
斐波那契数列就是后一个数是前两个数的和,即 n = (n-1) + (n-2) [n >2],那我们去Stream的API中查询,有没有生成这种规则的stream呢?
3. 查看API
翻看API,有两个API是有可能的, 分别是:
-
Stream#public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
- 通过T 类型seed,返回一个 T 类型的数据。UnaryOperator 继承Function<T,T>,给的泛型是T,返回的也是T
-
IntStream#public static IntStream generate(IntSupplier s)
- IntSupplier 返回一个int值
这两个方法都是给一个初始seed, 即种子,生成一个无限的有序stream, 用注释的话 即: Returns an infinite sequential ordered Stream produced by iterative application of a function f to an initial element seed. 所以完全符合我们的需求。
4. 动手撸码 (放心撸,大胆撸)
方式一
public static void fibonacci1() {
// 生成 整形数组,在通过flatmap 转换成一个集合输出
Stream.iterate(new Integer[]{0, 1}, t -> new Integer[]{t[0] + t[1], t[0] + t[1] + t[1]}) // 1
.flatMap(Arrays::stream) // flatMap 数据, 将数组元素转化成stream //2
.limit(10) // 默认是无线长度,所以要给出限制
.forEach(System.out::println);
}
按照fibonacci公式,我们需要n = (n-1) + (n-2), 要给出一个初始值,所以就想着给数组,然后在转化成stream,否则无法获取n-1和n-2。 这个有点像递归,给的是n,n+1, 生成的是 (n+n+1, n+n+1+n+1)
方式二
private static void fibonacci2() {
// 通过IntSupplier 和 stream.generate 生成
IntSupplier is = new IntSupplier() {
int pre = 0;
int current = 1;
@Override
public int getAsInt() {
int p = pre;
int next = pre + current;
pre = current;
current = next;
return p;
}
};
IntStream.generate(is).limit(10).forEach(System.out::println);
}
这个就有点像平时直接写的斐波那契数列了, 就是生成下一个数值,然后直接输出
5. 总结
有时候想到啥就快动手操作,偷会懒就不想接着干了。 文章交流,大家有问题欢迎指出,交流,谢谢!
以上是关于用jdk8的stream来实现斐波那契数列的主要内容,如果未能解决你的问题,请参考以下文章
谁能帮我用JAVA编写一个斐波那契数列,用eclipse实现,代码不对不采纳!
禅与计算机程序设计艺术使用 16 门编程语言实现斐波那契数列:循环控制指令与函数递归思想