A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

就业班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表达式
    :: 方法引用运算符, 它所在的表达式被称为方法引用

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马