文章目录

  • 五、use stream
    • 5.1 unlimited stream
      • 1、`iterate()`
      • 2、`generate()`
  • 六、用流收集数据
  • 七、并行流

五、use stream

5.1 unlimited stream

StreamAPI offers two static methods to generate Stream using functions,i.e. Stream.iterate() & Stream.generate() ,which both can create so-called Unlimited Streams:unlike these from Collection with limited and fixed size ,those streams area limited with infinite size. But ,obviously ,we’d better use limit(n) to limit the size,just to avoid creating literally Unlimited ones.

1、iterate()

先来个小题目:打印出最小的十个偶数,你咋写的?
再怎么说,总有个计数器的吧,这种实现多麻烦。

  // 写法1
int count = 0;
for (int i = 0;i < Integer.MAX_VALUE; i = i + 2) {if (count++ >=10) {return;}System.out.println(i);
}

假如用java8 的 无限流,只要三行搞定

// 写法2Stream.iterate(0, i -> i + 2).limit(10).forEach(System.out::println);

我们观察一下Stream.iterate的API 说明

要求传递一个seed ,然后一个单目函数,返回一个无限有序的流,流元素是由单目函数不断对前面元素迭代计算得到的。

我们来做个经典裴波那契数列的例子:如果不用java8 ,写个递归可以搞定,可仔细想想,递归这种思路不也就是 后一个元素对前面相邻元素的迭代运算吗?(TODO)
我们来换个思路:我们的目标是下面的数列,其特点是从第三项开始,每一项都是前面相邻两个元素的和:
0,1,1,2,3,5,8,13…
再来介绍下裴波那契元组数列
(0,1) ,(1,1),(1, 2),(2,3),(3,5),(5,8),(8,13)…
也就是:(0,1) ,(1,0+1),(1, 1+1),(2, 2+ 1),(3, 3+ 2),(5,5+3),(8,8+5)…
仔细看,每个元组只取第一个元素的话不就是裴波那契数列嘛!
下面,我们首先来对元组数列建模,我们用一个数组表示一个元组,然后将(0, 1)元组作为seed(种子值),?? 表示必传的一个 UnaryOperator。

  Stream.iterate(new int[] {0, 1}, ??).limit(20).forEach(System.out::println);

这里的UnaryOperator写法可就考验小伙伴对 函数的抽象能力了!
思考一下: 本质上就是每个元素都是元组(数组),元组第一个元素是前一个元组的后一个元素,元组的第二个元素是前一个元组两元素之和嘛!(你自己在纸上比划比划)

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

这样我们就得到了元组的无限流,不过我们只取了20个。
假如我们希望得到裴波那契数列,取这个流每个元组的第一个元素就可以了:

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

题外话:其实取每个元组的第二个元素也能得到从1 开始的裴波那契数列!

2、generate()

六、用流收集数据

七、并行流

Java8实战(Java8 in Action)精华篇相关推荐

  1. lambda 两个list获取交集_《Java8 实战》笔记 - Lambda 表达式

    Lambda 表达式介绍 ​ 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它 有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表.这个定义够大的,让我 ...

  2. 《Java8实战》读书笔记06:Parallel Stream 并行流

    <Java8实战>读书笔记06:Parallel Stream 并行流 第7章 并行数据处理与性能 7.1 并行流 7.1.1 将顺序流转换为并行流 7.1.2 测量流性能 7.1.3 正 ...

  3. Java8实战学习笔记(三)——函数式数据处理

    一.引入流 (一).引言 1.流是什么 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).可以看成遍历数据集的高级迭代器. 流可以透明地并行 ...

  4. 《Java8实战》-第六章读书笔记(用流收集数据-01)

    用流收集数据 我们在前一章中学到,流可以用类似于数据库的操作帮助你处理集合.你可以把Java 8的流看作花哨又懒惰的数据集迭代器.它们支持两种类型的操作:中间操作(如 filter 或 map )和终 ...

  5. 《Java8实战》笔记汇总

    <Java8实战>笔记(01):为什么要关心Java8 <Java8实战>笔记(02):通过行为参数传递代码 <Java8实战>笔记(03):Lambda表达式 & ...

  6. Java8实战 阅读二周目感想

    Java8实战是我目前看过的写的水平最高的一本书,由浅入深,深入浅出,九浅一深. 之前大略的过了一遍,但是对于前几章的内容一直有点雾里看花的感觉. 又读了一遍,感觉有点新的感想. 一.其中1.2.1中 ...

  7. JAVA8实战 -- Lamdba表达式

    JAVA8实战 文章目录 JAVA8实战 前言 一.JAVA8的核心和优势是什么 二.Lambda表达式 1.函数式编程 -- 将代码传递给方法(将方法作为参数传递给另外一个代码) 2.Lambda表 ...

  8. mxgraph进阶 三 Web绘图——mxGraph项目实战 精华篇

    Web绘图--mxGraph项目实战(精华篇) 声明 本文部分内容所属论文现已发表,请慎重对待. 需求 由于小论文实验需求,需要实现根据用户日志提取出行为序列,然后根据行为序列生成有向图的形式,并且连 ...

  9. mxgraph进阶(三)Web绘图——mxGraph项目实战(精华篇)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Web绘 ...

  10. Java8实战笔记--组合异步编程

    一.Future 初衷是对将来某个时刻会发生的结果进行建模. 想象成这样的场景:你拿了一袋子衣 服到你中意的干洗店去洗.干洗店的员工会给你张发票,告诉你什么时候你的衣服会洗好(这就 是一个Future ...

最新文章

  1. python利用opencv自带的颜色查找表(LUT)进行色彩风格变换
  2. Linux Kernel中gicv3实现:SPIs中断routing到指定的CPU
  3. 全球与中国抗生素软膏市场运营现状十四五及前景规划分析报告2021-2027年版
  4. java servicefactory_Java DirectoryServiceFactory.getDirectoryService方法代碼示例
  5. 开源内容管理系统 php mysql_十大免费PHP+MySql平台内容管理系统推荐
  6. 离职阿里4年后,我给年轻人的7点建议
  7. 驱动人生、驱动精灵等绿色去广告单文件版合集
  8. 仿羊了个羊H5游戏源码
  9. FastSearch - 快速搜索包含指定内容的所有文件
  10. 企业经营数据分析-读后感
  11. android企业自定义桌面
  12. 步进电机开环控制的要点
  13. 关于下载pdf请求不到数据问题
  14. 20145212罗天晨 恶意代码分析
  15. 观《我想吃掉你的胰脏》的一些看法
  16. matlab21世纪论坛,compressive sensing 压缩感知(转) 21世纪最火的研究方向
  17. kali网络渗透实验一:网络扫描与网络侦查
  18. 中华英才网或被全盘收购:三年对赌将近大限
  19. 利用raphael画图
  20. 西红柿为什么是蔬菜不是水果?

热门文章

  1. 空间计量经济学(1)---空间计量简介与空间权重矩阵设置
  2. html跑马灯代码大全(图片文字移动代码)
  3. 国产常用GIS工具软件
  4. 【RevitAPI】BuiltInParameter 枚举项
  5. html返回顶部动画,基于JavaScript实现回到页面顶部动画代码
  6. android 大牛播放组件,大牛播放器安卓版_大牛播放器好不好用
  7. c#如何实现叫号操作_C#银行排队叫号系统
  8. Vue - 超详细最新 WangEditor V5 富文本编辑器安装引入及使用教程(内含在 Nuxt.js 项目中引入的解决方案)
  9. 如何使用 Spring Boot 开发邮件系统
  10. 集体智慧编程--优化