介绍

Lambda表达式在Java语言中引入了一个新的语法元素和操作符,这个操作符为->,该操作符被称为Lambda操作符或箭头操作符,它将Lambda分为两个部分。

左侧:指定了Lambda表达式需要的所有参数

右侧:指定了Lambda体,即Lambda表达式要执行的功能

语法

格式一:无参,无返回值,Lambda体只需一条语句

 @Test
 public void test1() {
     Runnable r = () -> System.out.println("Hello Lambda!");
     r.run();
 }

有变量的格式

 @Test
 public void test2() {
     /**
      * 在Lambda里面使用该变量,jdk1.7以前必须加final,jdk1.8以后不用加final,但是不能在Lambda里面去改变其值
      */
     int num = 10;
     Runnable r = () -> System.out.println("Hello Lambda!" + num);
     r.run();
 }

格式二:有一个参数,无返回值

 @Test
 public void test3() {
     Consumer<String> con = (x) -> System.out.println(x);
     con.accept("hello Lambda!");
 ​
     //小括号可以省略
     Consumer<String> con1 = x -> System.out.println(x);
     con1.accept("hello Lambda!");
 }

格式三:有多个参数,有返回值,Lambda体有多条语句

 @Test
 public void test4(){
     Comparator<Integer> com = (x,y) -> {
         System.out.println("compare x and y");
         System.out.println("compare x and y");
         return Integer.compare(x,y);
     };
 ​
     int result = com.compare(10, 20);
     System.out.println(result);
 }

格式四:如果Lambda体只有一条语句,大括号和return都可以不写

 @Test
 public void test5() {
     Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
 ​
     int result = com.compare(10, 20);
     System.out.println(result);
 }

格式五:写参数的数据类型;数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

如果要写,所有的参数都要写,要不然都全部都不写

 @Test
 public void test6() {
     Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y);
 ​
     int result = com.compare(10, 20);
     System.out.println(result);
 }

函数式接口

定义:只包含一个抽象方法的接口

你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。

我们可以在任意函数式接口上使用`@FunctionalInterface`注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

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

函数式接口

参数类型

返回类型

用途

Consumer<T>消费型接口

T

void

对类型T的对象应用操作,包含方法:void accept(T t)

Supplier<T>供给型接口

T

返回类型为T的对象,包含方法:T get()

Function<T,R>函数型接口

T

R

对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法:R apply(T t)

Predicate<T>断言型接口

T

boolean

确定类型为T对象是否满足某约束,并返回boolean值。包含方法:boolean test(T t)

方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。

使用::操作符将方法名和对象或类的名字分隔开来。

三种格式

  • 对象::实例方法

  • 类::静态方法

  • 类::实例方法

注意事项

  • Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致

  • 第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,可以使用类名::实例方法

构造器引用

格式:ClassName::new

与函数式接口相结合,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致。