使用Stream输出斐波纳契元组序列

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

1
2
3
4
5
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生成流:

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

1
2
3
4
5
6
7
8
9
10
11
12
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 )将永远计算下去。同样,你不能对无限流做排序或归约,因为所有元素都需要处理,而这永远也完不成!

posted @   少说点话  阅读(339)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
网站运行:7年51天17时24分25秒
点击右上角即可分享
微信分享提示