zoukankan      html  css  js  c++  java
  • 用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. 总结

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

  • 相关阅读:
    Intellij IDEA 使用总结
    Apache Camel之FTP组件学习
    谈一谈EasyUI中TreeGrid的过滤功能
    JAVA实用案例之图片水印开发
    三、SolrCloud的搭建
    style里面设置变量
    for 循环中 break-continue 与label标签的使用
    vue ref的用法
    Vuex实践
    vue 数据动态响应(Vue.set方法)
  • 原文地址:https://www.cnblogs.com/lifacheng/p/12798097.html
Copyright © 2011-2022 走看看