zoukankan      html  css  js  c++  java
  • 使用Stream输出斐波纳契元组序列

    使用Stream流输出斐波那契数列:

    Stream.iterate(new int[]{0, 1},
            t -> new int[]{t[1],t[0] + t[1]})
        .limit(10)
        .map(t -> t[0])
        .forEach(System.out::println);                            
    

    使用IntSupplier生成流:

    但很重要的一点是,在并行代码中使用有状态的供应源是不安全的,这是一个副作用的例子

    IntSupplier fib = new IntSupplier(){
            private int previous = 0;
            private int current = 1;
            public int getAsInt(){
                int oldPrevious = this.previous;
                int nextValue = this.previous + this.current;
                this.previous = this.current;
                this.current = nextValue;
                return oldPrevious;
            }
    };
    IntStream.generate(fib).limit(10).forEach(System.out::println);                

      前面的代码创建了一个 IntSupplier 的实例。此对象有可变的状态:它在两个实例变量中记录了前一个斐波纳契项和当前的斐波纳契项。 getAsInt 在调用时会改变对象的状态,由此在每次调用时产生新的值。相比之下,使用 iterate 的方法则是纯粹不变的:它没有修改现有状态,但在每次迭代时会创建新的元组。你应该始终采用不变的方法,以便并行处理流,并保持结果正确。请注意,因为你处理的是一个无限流,所以必须使用 limit 操作来显式限制它的大小;否则,终端操作(这里是 forEach )将永远计算下去。同样,你不能对无限流做排序或归约,因为所有元素都需要处理,而这永远也完不成!

  • 相关阅读:
    洛谷 P1092 虫食算
    2018.3.25校内互测
    洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
    洛谷 P1879 [USACO06NOV]玉米田Corn Fields
    洛谷 P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper
    ZJOI Day 2 游记
    editorial-render A
    BZOJ2904
    BZOJ 1600
    构造脚本语言
  • 原文地址:https://www.cnblogs.com/sueyyyy/p/12228960.html
Copyright © 2011-2022 走看看