JavaSE之Stream


函数式接口

  1. 定义:只有一个必须被重写的抽象方法的接口

  2. 四大内置函数式接口:

    1. Consumer 消费型接口 void accept(T t) 对给定的参数执行此操作。

    2. Function 函数型接口 R apply(T t) 将此函数应用于给定的参数。

    3. Supplier 供给型接口 T get() 获取结果。

    4. Predicate 段言型接口 boolean test(T t) 根据给定的参数计算此谓词。

 

方法引用

简化lambda表达式的

  1. 前提 : 当lambda体的实现是通过调用另外一个方法实现的,可以通过方法引用直接引用这个方法,用来简化完整的lambda表达式的结构

  2. 语法:

    1. 对象::实例方法

    2. 类名::静态方法

    3. 类名::实例方法

  3. 要求:

    1. lambda的参数列表与返回值要求能够一一对应lambda体中所引用方法的参数列表与返回值

    2. lambda的返回值要求与所引用方法的返回值保持对应一致 lambda的参数列表如果只有一个参数 : 作为调用所引用的成员方法的对象存在 lambda的参数列表如果存在多个参数 : 第一个参数作为调用所引用的成员方法的对象存在,lambda的第二个参数开始,一一对应匹配所引用方法的参数列表

  4. 构造器引用: 数据类型::new

 

Stream

  1. 定义:数据的渠道,用来操作由数据源(数组,集合)所产生的元素序列.

  2. 区别:。IO流是传输数据

    1. Stream流:操作数据,计算数据

    2. IO流:传输数据

    3. 数组|集合 : 存储数据

  3. 特点:

    1. Stream流本身不会存储数据

    2. Stream不会修改数据源|源对象,每次回返回持有结果的新的流Stream

    3. 延迟执行|惰性加载 : 当获取终止行为时候,才会执行一系列的中间操作

    4. 流都是一次性的流,不能重复使用多次,一旦使用过就已经被破坏

  4. 步骤:

    1. 创建Stream

      1. Collection->stream

      2. Arrays->stream(数组)

      3. Stream.of(值列表)

    2. 中间操作:一系列流式的中间操作(都会返回一个持有结果的新的流)

      1. 过滤 Stream filter(Predicate<? super T> predicate);

      2. 去重 distinct()

      3. 截取 limit(long) 从第一个开始截取几个

      4. 跳过 skip(long) 跳过前n个

      5. 排序 sorted() --> 内部比较器 sorted(Comparator) ->外部比较器

      6. 映射 map(Function fun) stream操作的每一个数据都所用于参数函数,映射成一个新的结果,最后返回一个持有所有映射后的新的结果的流

    3. 终止行为

      1. 遍历 foreach(Consumer)

      2. 查找与匹配

      3. 规约 reduce:map->reduce,加工->计算结果

      4. 收集:collect()