用 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. 动手撸码 (放心撸,大胆撸)
方式一
按照fibonacci公式,我们需要n = (n-1) + (n-2), 要给出一个初始值,所以就想着给数组,然后在转化成stream,否则无法获取n-1和n-2。 这个有点像递归,给的是n,n+1, 生成的是 (n+n+1, n+n+1+n+1)
方式二
这个就有点像平时直接写的斐波那契数列了, 就是生成下一个数值,然后直接输出
5. 总结
有时候想到啥就快动手操作,偷会懒就不想接着干了。 文章交流,大家有问题欢迎指出,交流,谢谢!
评论