就业班JavaSE高级部分day13 Stream 方法引用
Stream流:
Stream流式思想处理数据的方式:
让代码的执行像流水线一样, 先设计好处理方案, 然后一按开关开始执行
流相比于集合的2个优点:
1. Pipelining(管道特性): "可以链式调用"
Stream流对象的 延迟方法 调用后, 会返回新的Stream流对象, 可以链式调用
每个方法类似于一条一条的管道, 衔接了不同的处理方案
2. 内部迭代特性: "不用写for循环"
集合遍历通过 Iterator 或者 增强for, 显式的在集合外部进行迭代, 这叫做外部迭代
Stream提供了内部迭代的方法 forEach(Consumer c), 可以直接调用遍历方法
使用Stream流的3个步骤:
1. 获取数据源 (从"集合"或"数组"转换为"Stream"对象)
2. 数据处理 (调用延迟方法, 编写处理方案)
3. 获得结果 (调用终结方法, 启动开关)
2种获取Stream流的方式
获取Stream流对象的2种方式:
1. 利用"Collection接口"中的默认方法 default Stream<E> stream() 方法: 集合转Stream对象
2. 利用"Stream接口"中的静态方法 static <T> Stream<T> of(T... values): 数组转Stream对象
Stream API: 方法分类
延迟方法: (具有延迟执行的特性)
返回值类型"是Stream"类型的方法, 支持链式调用
Stream filter(): 过滤
Stream map(): 映射/转换
Stream limit(): 截取
Stream skip(): 跳过
终结方法:
返回值类型"不是Stream"类型的方法, 不支持链式调用
void forEach(): 遍历
long count(): 统计
// 抽象方法
void forEach(Consumer<? super T> action): 遍历流中的元素进行逐一消费. 并不保证元素的逐一消费动作在流中是被有序执行的
Stream API: 静态方法concat()合并两个流
java.util.stream.Stream<T>接口: 管道接口
// 静态方法
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b): 合并两个流的元素, 变成一个新的流. 两个流中的元素类型必须相同, 或有共同的父类
(扩展: 收集器)
如何理解Stream流:
Stream不是集合, 也不是数组, 也不是某种数据结构, 所以Stream内部"不能存储"元素
Stream是一种"函数模型", 规定一些对于集合或数组的处理方案:
在调用"延迟方法"时, 就是在编写处理方案, 但并未真正执行方案
在调用"终结方法"时, 才一次性按照处理方案来操作集合
这也是流式操作"延迟执行"的特点
收集器的作用:
收集Stream操作后的结果, 转换为其他容器
对流操作完成之后, 如果需要将其结果进行收集, 例如转换为对应的"集合"或"数组"等
java.util.stream.Stream<T>接口: 流
Object[] toArray(): 将当前Stream流对象转换为Object[]数组
<R,A> R collect(Collector<? super T,A,R> collector): 将当前Stream流对象根据传入的Collector转换为集合或数组
java.util.stream.Collectors类: 收集器静态工具类, 提供不同转换方式的Collector
static <T> Collector<T,?,List<T>> toList(): Stream转List集合
static <T> Collector<T,?,Set<T>> toSet(): Stream转Set集合
static <...> Collector<...> toMap(Function<? super T,? extends K> keyMapper,
Function<? super T,? extends U> valueMapper)
Stream转Map集合.
Function keyMapper: 生成key的转换方式
Function valueMapper: 生成value的转换方式
方法引用
方法引用: Method Reference
如果Lambda表达式仅仅是调用一个已经存在的方法, 那就可以通过方法引用来替代Lambda表达式
作用: 简化Lambda表达式
:: 方法引用运算符, 它所在的表达式被称为方法引用
|