1.条件:只能应用于函数式接口(即必须是接口,并且里面只有一个抽象方法);
例如:
//函数式接口
interface Swimming {
void swim();//接口的方法中默认有public abstract修饰
}
2.认识lambda表达式:简化匿名内部类的代码
public class LambdaTest1 {
public static void main(String[] args) {
Swimming s = () -> { // 此处()中的内容应该和接口Swimming中的swim()方法一样
System.out.println("狗游的飞快~~");
};
s.swim();
}
}
interface Swimming {
void swim();
}
//输出:狗游的飞快~~
省略规则:
1.参数类型可以省略不写
2.如果只有一个参数,参数类型可以省略,同时()也可以省略
3.如果Lambda表达式中的方法体只有一行代码,可以省略 {} ,同时要省略 ; 此时,如果这行代码是return语句,也必须去掉return
为什么可以省略参数类型?
Java 编译器可以根据上下文推断出 Lambda 表达式的参数类型。
由于在接口的方法中,已经定义了每⼀个参数的类型是什么。而且在使用lambda表达式实现接口的时候,必须要保证参数的数量和类型需要和接口中的方法保持⼀致。因此,此时lambda表达式中的参数的类型可以省略不写。
我们拿一个Set集合自定义排序规则中的一段代码来一步步实现简化代码:
具体怎么排序下面会讲到,这里只用看简化过程。
//原代码
public int compare(Student o1, Student o2) {
return Double.compare(o1.getHeight(),o2.getHeight());
}
//省略参数类型
public int compare(o1,o2) ->{
return Double.compare(o1.getHeight(),o2.getHeight());
}
//省去return和{}和;
public int compare(o1,o2) -> Double.compare(o1.getHeight(),o2.getHeight())
1.可以让Student类实现Comparable接口,重写里面的ComparaTo方法来比较(下面比较的的是年龄)
2.调用TreeSet集合的有参构造器,设置Comparator对象,自定义比较规则(下面比较的是身高)
话不多说,直接上代码:
定义一个学生类:
//定义一个学生类
public class Student implements Comparable {
private String name;
private int age;
private double height;
public String getName() {
return name;
}
//第一种方法
@Override
// this o
public int compareTo(Student o) {
return this.age - o.age;
}
public void setName(String name) {
this.name = name;
}
public Student(String name, int age, double height) {
super();
this.name = name;
this.age = age;
this.height = height;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", height=" + height + "]";
}
}
排序代码的实现:
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest01 {
public static void main(String[] args) {
//第二种方法
// 创建TreeSet对象时传入Comparator对象,实现接口方法
Set students = new TreeSet<>(new Comparator() {
@Override
public int compare(Student o1, Student o2) {
return Double.compare(o1.getHeight(), o2.getHeight());
}
});
// 简化后的代码
// Set students = new TreeSet<>((o1, o2) ->Double.compare(o1.getHeight(), o2.getHeight()));
students.add(new Student("库里", 23, 188.7));
students.add(new Student("小明", 22, 169.8));
students.add(new Student("小红", 26, 165.5));
students.add(new Student("李华", 22, 183.5));
System.out.println(students);
}
}
当使用两种方式同时排序时,会以第二种为主,故遍历集合后输出的结果为():
Student [name=小红, age=26, height=165.5]
Student[name=库里, age=23, height=169.7]
Student [name=小明, age=29, height=169.8]
Student [name=李华, age=21, height=183.5]