在做排序比较的时候,我们写出这样的一个类,根据学生的成绩进行排序:
package demo01;
import java.util.*;
/**
* 学习 Lambda 表达式就是为了代替匿名内部类的
* 让匿名内部类变得更简单
*/
public class HelloCollection {
public static void main(String[] args) {
List<Student> student = new ArrayList<>();
student.add(new Student(1, "zahngsan2", 99));
student.add(new Student(3, "zahngsan3", 22));
student.add(new Student(0, "zahngsan5", 39));
student.add(new Student(8, "zahngsan1", 49));
student.add(new Student(5, "zahngsan4", 69));
}
}
class ScoreComparable implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.getScore() - o2.getScore();
// 分数比较器:
}
}
class Student {
private int id;
private String name;
public Student(int id, String name, int score) {
this.id = id;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", score=" + score +
'}';
}
private int score;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public Student() {
}
}
此时要想用 Collections 接口的 sort 函数,我们应该这样写:
Collections.sort(student, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getScore() - o2.getScore();
}
});
比较复杂,并且代码比较多,所以我们采用 Lambda 表达式进行对比:
Lambda 表达式的基本语句就是 (x,y) -> {}
Collections.sort(student, (x,y)-> {
return x.getName().compareTo(y.getName());//按照字母升序进行排序
});
Lambda表达式的语法格式:
当创建一个接口对象的时候,如果直接 new 对象,必须重写接口的方法,此时用 Lambda 表达式可以非常简洁地写出,只需要在创建对象的时候,= () -> {}; 即可
package demo01;
public class Hello02Fly {
public static void main(String[] args) {
Fly fly = new Fly() {
@Override
public void fly() {
System.out.println("我废了");
}// 匿名内部类
};
Fly fly2 = () -> {
System.out.println("鹰飞飞翔");
};
fly2.fly();// Lamdba 表达式创建
}
}
interface Fly {
void fly();
}
使用 Lambda 表达式的前提是 必须是函数式接口,也就是接口中只有一个方法的接口,如果有两个及以上的方法,不能使用 Lambda 表达式:
interface Run {
void run1();
void run2();
}
可以使用一个注解:
@FunctionalInterface
来进行验证,防止别人修改接口:
@FunctionalInterface
interface Run {
void run2();
}