Java-Lambda表达式
介绍
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也会包含一条声明,说明这个接口是一个函数式接口。
内置的四大核心函数式接口
函数式接口 | 参数类型 | 返回类型 | 用途 |
---|---|---|---|
| T | void | 对类型T的对象应用操作,包含方法: |
| 无 | T | 返回类型为T的对象,包含方法: |
| T | R | 对类型为T的对象应用操作,并返回结果。结果是R类型的对象。包含方法: |
| T | boolean | 确定类型为T对象是否满足某约束,并返回boolean值。包含方法: |
方法引用
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用。
使用::
操作符将方法名和对象或类的名字分隔开来。
三种格式
对象::实例方法
类::静态方法
类::实例方法
注意事项
Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致
第一个参数是实例方法的调用者,第二个参数是实例方法的参数时,可以使用
类名::实例方法
构造器引用
格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容,可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致。