day13--Stream流 Stream流式思想处理数据的方式:
让代码像流水线一样, 一步一步的对数据进行处理, 得到最终的结果
流也可以看作是一个容器, 里面可以装很多元素, 形成元素流
流相比于集合的2个优点:
1. Pipelining(管道特性)
Stream流对象的一些方法调用完毕后, 会返回新的Stream流对象, 类型相同, 可链式调用, 类似于"管道"
2. 内部迭代特性:
集合遍历通过 Iterator 或者 增强for, 显式的在集合外部进行迭代, 这叫做外部迭代
Stream提供了内部迭代的方法 forEach(), 可以直接调用遍历方法 Stream API: 方法分类, forEach()遍历
延迟方法: (具有延迟执行的特性)
返回值类型 是 Stream接口自身类型的方法, 支持链式调用
filter(): 过滤
map(): 映射/转换
limit(): 截取
skip(): 跳过
终结方法:
返回值类型 不是 Stream接口自身类型的方法, 不支持链式调用
forEach(): 遍历
count(): 统计
注意:
除了终结方法外, 其余方法均为延迟方法
------------------------------------------------------
创建数据源 -> filter()过滤 | map()映射 | limit()截取 | skip()跳过 -> forEach() | count()结果
------------------------------------------------------
获取流 转换 聚合
延迟方法 终结方法
new ArrayList().filter(...).map(...).limit(...).skip(...).forEach(...);
Stream.of(1,2,3).filter(...).map(...).limit(...).skip(...).count(); Stream流的特点: 只能使用一次
每次调用延迟方法返回的Stream流对象, 都是经过处理后返回的新的Stream流对象
之前的Stream流在调用方法后, 已经使用过并关闭了, 不能再次使用, 否则会抛出异常: 方法引用方法引用基本介绍
方法引用: Method Reference
如果Lambda表达式仅仅是调用一个已经存在的方法, 那就可以通过方法引用来替代Lambda表达式
作用: 简化Lambda表达式
:: 方法引用运算符, 它所在的表达式被称为方法引用 方法引用能简化以下场景: (方法名后不要写小括号)
1. 通过对象名引用成员方法 对象名::成员方法名 System.out::println
2. 通过类名引用静态方法 类名::静态方法名 i -> Math.abs(i) Math::abs
3. 通过super引用父类成员方法 super::父类方法名 ()->super.eat(); super::eat
4. 通过this引用本类成员方法 this::本类方法名 ()->this.eat(); this::eat
5. 引用某个类的构造方法 类名::new name->new Person(name) Person::new
6. 引用创建数组的方法 数据类型[]::new length->new int[length]; int[]::new 引用数组的构造方法: //需求: //已知如下代码, 请补全Test类中main()方法的代码, 分别用Lambda和方法引用方式, 调用createArray方法 // 定义创建数组的函数式接口, 模拟Java中已经提供的函数式接口 @FunctionalInterface public interface ArrayBuilder { // 根据指定length长度, 创建一个int[]数组. 怎么创建需要我们传递Lambda实现 int[] builderArray(int length); } // 测试类 public class Test { // 定义方法用于创建数组 // 参数: 数组的长度 和 创建数组的方式 public static int[] createArray(int length, ArrayBuilder ab){ return ab.builderArray(length); } public static void main(String[] args) { // Lambda方式调用createArray: 传递长度10, 以及创建数组的Lambda表达式 // 方法引用方式调用createArray: 传递长度10, 和数组的构造方法 } } public class Test { // 定义方法用于创建数组 // 参数: 数组的长度 和 创建数组的方式 public static int[] createArray(int length, ArrayBuilder ab){ return ab.builderArray(length); } public static void main(String[] args) { // Lambda方式调用createArray: 传递长度10, 以及创建数组的Lambda表达式 int[] arr1 = createArray(10, length -> new int[length]); System.out.println(arr1.length); // 方法引用方式调用createArray: 传递长度10, 和数组的构造方法 int[] arr2 = createArray(10, int[]::new); System.out.println(arr2.length); } }
|