Lambda表达式的使用
1.Lambad本质上是对方法的一种简写。
首先看一段官方的解释
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
可以理解为,Lambda表达式就是对匿名函数的简写。
Lambda的格式(也就是简写之后)为:(参数列表)->{Lambda体}
举个例子:
定义一个人类
class Person {
private String name;//姓名
private Integer age;//年龄
public Person(){
}
public Person(String name, Integer age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public void setAge(Integer age){
this.age = age;
}
public String getName(){
return this.name;
}
public Integer getAge(){
return this.age;
}
@Override
public String toString() {
return "Pserson{" +
"name='" + name + '\'' +
", age='" + age +
'}';
}
}
创建一个列表并对列表排序,使用Comparator接口的匿名函数定义比较规则
public class HelloWord{
public static void main(String[] args) throws Exception{
List<Person> list = new ArrayList<>();
list.add(new Person("lff", 23));
list.add(new Person("lef", 25));
list.add(new Person("wll", 18));
list.add(new Person("wll", 24));
//这里使用了Comparator接口的匿名函
list.sort(new Comparator<Person>(){
@Override
public int compare(Person p1, Person p2){
return p1.getAge() - p2.getAge();
}
});
for (Person p : list) {
System.out.println(p);
}
}
}
输出的结果为:
将匿名函数替换为Lambda表达式,格式为:(参数列表)->{Lambda体}
public class HelloWord{
public static void main(String[] args) throws Exception{
List<Person> list = new ArrayList<>();
list.add(new Person("lff", 23));
list.add(new Person("lef", 25));
list.add(new Person("wll", 18));
list.add(new Person("wll", 24));
list.sort(
(Person p1, Person p2)->{return p1.getAge() - p2.getAge();}
);
for (Person p : list) {
System.out.println(p);
}
}
}
输出的结果仍然为
因此,Lambda代替了原来的匿名函数,是一种更简便的表达,可以理解为Lambda代表了匿名函数的一个实例。
//Comparetor接口
Comparator<Person> com = (Person p1, Person p2)->->{return p1.getAge() - p2.getAge();};
2.进一步化简Lambda表达式
- 数据类型可以省略,由编译器推断
Consumer<String> con = (str)->{System.out.println(str);};
- 若参数列表只有一个参数时,小括号可以省略
Consumer<String> con = str->{System.out.println(str);};
- 若Lambda体只有一条语句时,return 与大括号若有,可以省略。
Comparator<Integer> com = (x,y)->Integer.compare(x,y);
但是Lambda表达式的简化有一定的限制,它只能简化一类特殊的接口,称为“函数式接口”。
函数式接口
所在包:java.util.function
只包含一个抽象方法的接口,称为函数式接口。这样才可以保证Lambda简化的是一个确定的函数。
可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。
常用的函数式接口:
//比较器
Interface Comparator<T> int compare(T o1, T o2)
//线程
Interface Runnable void run()
四大内置函数式接口:
方法引用与构造器引用
作用是对Lambda表达式的更进一步的简化
- 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
- 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!
- 格式:使用操作符 “
::
” 将类(或对象) 与 方法名分隔开来。
方法引用的三种类型
对象::实例方法名
注意:当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数)时:
ClassName::methodName
类::静态方法名
类::实例方法名
构造器引用的类型
ClassName::new