写点什么

用 jdk8 的 stream 实现斐波那契数列

用户头像
编号94530
关注
发布于: 2020 年 04 月 29 日
用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. 总结

有时候想到啥就快动手操作,偷会懒就不想接着干了。 文章交流,大家有问题欢迎指出,交流,谢谢!



用户头像

编号94530

关注

你的每一个点赞我都当成了喜欢 2020.04.29 加入

公众号: 星球x 欢迎大家关注,谢谢!

评论

发布
暂无评论
用jdk8的stream实现斐波那契数列