1. 函数式接口
函数式接口 (Functional Interface) 中有且仅有一个抽象方法,函数式接口适用于 Lambda 表达式。在 Java8 中,可以使用 @FunctionalInterface 注解来标注一个接口为函数式接口。
2. 测试
2.1 定义函数式接口 MyComparator
@FunctionalInterface
public interface MyComparator<T> {
int compare(T t1, T t2);
}
2.2 定义 Student 类
public class Student {
private String name;
private int age;
// getter setter ...
}
2.3 测试,通过 MyComparator 实现Student排序
public class Main {
public static void main(String[] args) {
// 函数式接口作为传参
Student s1 = new Student("s1", 10);
Student s2 = new Student("s2", 30);
Student s3 = new Student("s3", 20);
List<Student> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
// 使用匿名内部类
/*sort(list, new MyComparator<Student>() {
@Override
public int compare(Student t1, Student t2) {
return t1.getAge() - t2.getAge();
}
});*/
// 使用 lambda
sort(list, (t1, t2) -> t1.getAge() - t2.getAge());
/*
成功排序
Student{name='s1', age=10}
Student{name='s3', age=20}
Student{name='s2', age=30}
*/
list.forEach(System.out::println);
}
/**
* 对list进行排序, 传参包含函数式接口
* @param list 目标排序集合
* @param myComparator 比较器
*/
private static <T> void sort(List<T> list, MyComparator<T> myComparator) {
// 冒泡排序
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - 1 - i; j++) {
T first = list.get(j);
T second = list.get(j + 1);
if (myComparator.compare(first, second) > 0) {
list.set(j, second);
list.set(j + 1, first);
}
}
}
}
}