用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. 总结

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

原文地址:https://www.cnblogs.com/lifacheng/p/12798097.html