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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dyynrahbsqt 中级黑马   /  2018-12-2 16:56  /  563 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
    }
}

0 个回复

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