1. Pipelining(管道特性): "可以链式调用"
2. 内部迭代特性: "不用写for循环"
1. 获取数据源 (从"集合"或"数组"转换为"Stream"对象)
2. 数据处理 (调用延迟方法, 编写处理方案)
3. 获得结果 (调用终结方法, 启动开关)
1. 利用"Collection接口"中的默认方法 default Stream stream() 方法: 集合转Stream对象
2. 利用"Stream接口"中的静态方法 static Stream of(T... values): 数组转Stream对象
static Stream of(T... values): 将"数组"转换为Stream对象
如何理解Stream流:
何理解Stream流: Stream不是集合, 也不是数组, 也不是某种数据结构, 所以Stream内部"不能存储"元素
Stream是一种"函数模型", 规定一些对于集合或数组的处理方案:
在调用"延迟方法"时, 就是在编写处理方案, 但并未真正执行方案
在调用"终结方法"时, 才一次性按照处理方案来操作集合
这也是流式操作"延迟执行"的特点
收集器的作用:
收集Stream操作后的结果, 转换为其他容器
对流操作完成之后, 如果需要将其结果进行收集, 例如转换为对应的"集合"或"数组"等
java.util.stream.Stream接口: 流
Object[] toArray(): 将当前Stream流对象转换为Object[]数组
R collect(Collector collector): 将当前Stream流对象根据传入的 Collector转换为集合或数组
java.util.stream.Collectors类: 收集器静态工具类, 提供不同转换方式的Collector
static Collector> toList(): Stream转List集合
static Collector> toSet(): Stream转Set集合
static <...> Collector<...> toMap(Function keyMapper,
Function valueMapper)
Stream转Map集合.
Function keyMapper: 生成key的转换方式
Function valueMapper: 生成value的转换方式
方法引用
方法引用: Method Reference
如果Lambda表达式仅仅是调用一个已经存在的方法, 那就可以通过方法引用来替代Lambda表达式
作用: 简化Lambda表达式
:: 方法引用运算符, 它所在的表达式被称为方法引用
Lambda表达式写法:
Lambda中, 重写方法的"参数", 必须是方法引用的方法"要接收的类型", 否则会抛出异常
(String s) -> System.out.println(s) 方法有个参数String s
System.out::println 引用的println方法必须能接收String类型的s
注意:
Lambda中, 重写方法的"参数", 必须是方法引用的方法"要接收的类型", 否则会抛出异常
通过类名引用静态方法
类名::静态方法名 Math.abs(1) Math::abs
适用场景:
当Lambda表达式中, 仅仅是"通过某个类名, 调用已有的静态方法"时, 就可以用这种方式简化
方法引用: 通过super引用父类成员方法
通过super引用父类成员方法
super::父类方法名
适用场景
当Lambda表达式中, 仅仅是"在子类中, 调用父类某个已有的方法"时, 就可以用这种方式简化
方法引用: 通过this引用本类成员方法
通过this引用本类成员方法
this::本类方法名
适用场景:
当Lambda表达式中, 仅仅是"调用本类中, 某个已有的方法"时, 就可以用这种方式简化
方法引用: 类的构造方法引用
引用某个类的构造方法
类名::new
使用场景
当Lambda表达式中, 仅仅是"调用某个类的构造方法, 来创建一个对象"时, 就可以用这种方式简化
方法引用: 数组的构造方法引用
引用创建数组的方法
数据类型[]::new
使用场景
当Lambda表达式中, 仅仅是"创建一个数组对象"时, 就可以用这种方式简化