1. 外部迭代

1.1. for循环是一个封装了迭代的语法糖

1.1.1. 本质上来讲是一种串行化操作

1.2. 很难抽象出不同操作

2. 内部迭代

2.1. 内部迭代中的相应接口:Stream

2.2. 和Iterator类似,Stream是一种内部迭代方式

2.3. 内部迭代将更多控制权交给了集合类

3. Stream

3.1. 理想方式

3.1.1. 形成一个惰性求值的链,最后用一个及早求值的操作返回想要的结果

3.2. Stream工厂是更好的选择

3.2.1. 仅暴露一个Stream接口,都不会影响内部的List或Set

3.3. 用函数式编程方式在集合类上进行复杂操作的工具

3.4. 惰性求值方法

3.4.1. 最终不产生新集合的方法

3.5. 及早求值方法

3.5.1. 最终会从Stream产生值的方法

3.6. 判断标准

3.6.1. 返回值是Stream

3.6.2. 返回值是另一个值或为空

4. 常用的流操作

4.1. of方法

4.1.1. 使用一组初始值生成新的Stream

4.2. collect(toList())方法

4.2.1. 由Stream里的值生成一个列表

4.2.2. 一个及早求值操作

4.3. map

4.3.1. 将一个流中的值转换成一个新的流

4.3.2. 一个函数可以将一种类型的值转换成另外一种类型

4.3.3. 参数和返回值不必属于同一种类型

4.3.4. 必须是Function接口的一个实例

4.3.4.1. Function接口是只包含一个参数的普通函数接口

4.4. flatMap

4.4.1. 可用Stream替换值,然后将多个Stream连接成一个Stream

4.4.2. 调用stream方法,将每个列表转换成Stream对象,其余部分由flatMap方法处理

4.4.3. Function接口

4.4.3.1. 方法的返回值限定为Stream类型

4.5. filter

4.5.1. 遍历数据并检查其中的元素

4.5.2. 值为true的元素被保留下来

4.5.3. Predicate接口

4.6. reduce

4.6.1. 实现从一组值中生成一个值

4.6.2. count方法

4.6.3. max和min

4.6.3.1. 返回Optional对象

4.6.3.1.1. 代表一个可能存在也可能不存在的值

4.6.3.2. Comparator对象

4.6.3.2.1. 静态方法comparing
4.6.3.2.2. 有且只有一个抽象方法
4.6.3.2.3. 实际上是一个函数接口

5. 多次调用流操作缺点

5.1. 代码可读性差,样板代码太多,隐藏了真正的业务逻辑

5.2. 效率差,每一步都要对流及早求值,生成新的集合

5.3. 代码充斥一堆垃圾变量,它们只用来保存中间结果

5.4. 难于自动并行化处理

6. 高阶函数

6.1. 接受另外一个函数作为参数,或返回一个函数的函数

6.2. 函数的参数列表里包含函数接口,或该函数返回一个函数接口

6.3. 没有副作用的函数不会改变程序或外界的状态

6.3.1. 给变量赋值是一种副作用

6.3.2. 向控制台输出了信息是一种副作用

6.3.3. 获取值使用户更容易写出没有副作用的代码

6.3.4. Lambda表达式传给Stream上的高阶函数,都应该尽量避免副作用

6.3.5. 唯一的例外是forEach方法,它是一个终结方法

最新文章

  1. 计算机程序的思维逻辑 (41) - 剖析HashSet
  2. php 7.0 安装以及老版本php删除
  3. javascript 之 prototype继承机制
  4. JSON简介
  5. jmeter 函数助手里的P,property的使用
  6. anriod TabHost
  7. jq each 用法以及js与json互转
  8. python生成数据库中所有表的DESC描述
  9. Nemerle Quick Guide
  10. storm源码之巧用java反射反序列化clojure的defrecord获取属性值
  11. 使用IDEA开发及测试Spark的环境搭建及简单测试
  12. Gist - Fetch Usage
  13. ctf变量覆盖漏洞:
  14. 完成 bass 库的频谱显示效果图
  15. eikonal equation - 程函方程
  16. maven+testng+eclipse
  17. Selenium Java环境配置
  18. JS应用实例4:表格隔行换色
  19. spinlock一边连逻辑一边连控制器
  20. SpringMVC由浅入深day01_5注解的处理器映射器和适配器

热门文章

  1. 从小白到架构师(4): Feed 流系统实战
  2. Mysql InnoDB Redo log
  3. SimpleDateFormat线程安全问题排查
  4. Java反应式编程(1)
  5. 嵌入式-C语言基础:结构体
  6. WPF之lognet4的基本使用
  7. Latex数学公式学习
  8. 并发bug之源(二)-有序性
  9. 解决Anaconda关联VSCode使用conda运行Python报错(无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序)
  10. layui的switch监听事件无用