Java8 新特性 -- 笔记

1. Java8 优点

速度更快

 

2.语法

2.1 Lambda表达式

  • 匿名内部类中使用的局部变量只能是final类型,不允许修改

     

2.2 基本语法

2.2.1 Lambda 表达式的基础语法:

  • Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符。箭头操作符将 Lambda 表达式拆分成两部分:

    • 左侧:Lambda 表达式的参数列表

    • 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体

  • 语法格式一:无参数,无返回值

    () -> System.out.println("Hello Lambda!");

  • 语法格式二:有一个参数,并且无返回值

    (x) -> System.out.println(x)

  • 语法格式三:若只有一个参数,小括号可以省略不写

    x -> System.out.println(x)

  • 语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句

    Comparator<Integer> com = (x, y) -> {

    System.out.println("函数式接口");

    return Integer.compare(x, y);

    };

  • 语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

    Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

  • 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

    (Integer x, Integer y) -> Integer.compare(x, y);

总结:

  • 上联:左右遇一括号省

  • 下联:左侧推断类型省

  • 横批:能省则省

     

2.2.2 Lambda 表达式需要“函数式接口”的支持

  • 函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰

  • 可以检查是否是函数式接口

     

2.2.3 Java8 内置的四大核心函数式接口

  • Consumer<T> : 消费型接口

    void accept(T t);

    需求:用于输出

  • Supplier<T> : 供给型接口

    T get();

    需求:产生指定个数的整数,并放入集合中

  • Function<T, R> : 函数型接口

    R apply(T t);

    需求:用于处理字符串

  • Predicate<T> : 断言型接口:

    boolean test(T t);

    需求:将满足条件的字符串,放入集合中

     

2.3 方法引用和构造器引用

2.3.1 方法引用

  • 方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用(可以将方法引用理解为 Lambda 表达式的另外一种表现形式)

    1. 对象的引用 :: 实例方法名

    1. 类名 :: 静态方法名

    1. 类名 :: 实例方法名

  • 注意:

  • ①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!

  • ②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName

     

2.3.2 构造器引用

  • 构造器引用 :构造器的参数列表,需要与函数式接口中参数列表保持一致!

  • 类名 :: new

     

2.3.3 数组引用

  • 类型[] :: new;

     

3. Stream

3.1 原理定义

流是数据渠道,用于操作数据源(集合,数组等)所产生的元素序列。集合讲的是数据,流讲的是计算!

注意:

  1. Stream 自己不会存储元素;

  2. Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream.

  3. Stream操作是延迟执行的。这意味着他们会等到需要结果的时候执行。

 

3.2 Stream 操作流程

  • 创建Stream

    一个数据源(如:集合,数组),获取一个流

  • 中间操作

    一个中间操作链,对数据源的数据进行处理

  • 终止操作(终端操作)

    一个终止操作,执行中间操作链,并产生结果

3.3 各步骤实现方法

3.1 创建Stream

  • Collection 提供了两个方法 stream() 与 parallelStream()

  • 通过 Arrays 中的 stream() 获取一个数组流

  • 通过 Stream 类中静态方法 of()

  • 创建无限流

    • 迭代

    • 生成

       

3.2 中间操作

  • 多个中间操作可以连接起来形成一个流水线,除非流水线上出发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。

  • 筛选与切片 filter——接收 Lambda , 从流中排除某些元素。 limit——截断流,使其元素不超过给定数量。 skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补 distinct——筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素

  • 映射 map——接收 Lambda , 将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。 flatMap——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

  • sorted()——自然排序 sorted(Comparator com)——定制排序

 

3.3 终止操作

  • 常见方法

    allMatch——检查是否匹配所有元素 anyMatch——检查是否至少匹配一个元素 noneMatch——检查是否没有匹配的元素 findFirst——返回第一个元素 findAny——返回当前流中的任意元素 count——返回流中元素的总个数 max——返回流中最大值 min——返回流中最小值

    注意:流进行了终止操作后,不能再次使用

  • 归约 reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——可以将流中元素反复结合起来,得到一个值。

  • collect——将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法

  • 分组 / 多级分组 / 分区

 

posted @ 2020-08-23 16:22  胖墩墩的竹  阅读(102)  评论(0)    收藏  举报