概述

image.png

Lambda匿名函数

语法:

  1. @Test
  2. public void test(){
  3. Runnable runnable = () -> {
  4. System.out.println("hi");
  5. };
  6. }

格式:
->操作符 :lambda操作符
->操作符的左边是形参列表
->操作符的右边是函数体

函数式接口

如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口

  • 函数式接口的使用场景:用Lambda表达式创建该函数式接口的实例
  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。
  • 以前用匿名实现类表示的都可以用Lambda完成

Java内置四大核心函数式接口
image.png

  • 对应了四种场景(是否有返回值、返回类型等)
  • 当Lambda表达式与函数式接口场景相同时,可以考虑采用函数式接口

方法引用

方法引用就是Lambda表达式,也是函数式接口的一个实例
也就是说,我们可以直接引用已实现的方法(参数列表得一致),来做类同的功能

格式:
类(或对象) : : 方法名

  1. // 类 :: 方法
  2. //Comparator中的int compare(T t1,T t2)
  3. //Integer中的int compare(T t1,T t2)
  4. @Test
  5. public void test3() {
  6. Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);
  7. System.out.println(com1.compare(12,21));
  8. System.out.println("*******************");
  9. Comparator<Integer> com2 = Integer::compare; // 方法引用
  10. System.out.println(com2.compare(12,3));
  11. }
  • 发现com1的匿名表达式实现的功能在Integer类中,已经有compare方法实现了,所以这里可以使用方法引用。

接口的增强

当多个类实现一个接口的某个方法时,方法的具体实现代码相同,这样就会造成代码重复问题。接口增强就相当于把公共的代码抽离出来,放入接口定义中

增强接口中可以有属性,可以有抽象方法,也可以有具体的方法

  1. interface MyInterface {
  2. public void print();
  3. // default 和 static 方法的出现为了解决实现该接口的子类代码重复的问题
  4. default void defaultMethod() {
  5. System.out.println("default method invoked! ");
  6. }
  7. static void staticMethod() {
  8. System.out.println("static method invoked! ");
  9. }
  10. }
  • 接口中定义具体的方法实现是有限制的,它只能定义default和static类型的方法。

Stream API

java8提供了一套api,使用这套api可以对集合的数据进行过滤、排序、映射、归约等操作。

Optional

Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null ,表示这个值不存在。

  • Optional的作用是可以避 免空指针异常,并且给出了针对空指针的处理。