什么是Lambda表达式?
答:用于创建(实例化)函数式接口对象的一种新语法。函数式接口,指的是只有一个抽象方法的接口。
在学习的过程中发现Comparator接口中不止一个方法,但是也可以使用Lambda表达式,因此本文是对该问题的学习和记录。
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
default Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other);
return (Comparator<T> & Serializable) (c1, c2) -> {
int res = compare(c1, c2);
return (res != 0) ? res : other.compare(c1, c2);
};
}
//后面省略
}
- @FunctionalInterface注解
新注解,用来标注这是一个“方法接口”,即一个接口中只有一个方法去实现
- default关键字
在一个被@FunctionalInterface标注的接口中,可以用这个关键字来区分“方法接口”想要在lambda表达式中起作用的方法和不会起作用的方法
Comparator中的equals方法和Object中的重复了,而Object是任何类的父类,所以不管任何实现Comparator的类都有继承自Object的equals方法的实现,所以可以使用Lambda表达式,示例代码如下:
Integer[] sums = {2,1,3,0,5};
Arrays.sort(sums, (o1,o2) -> {return o1.compareTo(o2);});
JDK 1.8之前已有的函数式接口:
• java.lang.Runnable
• java.util.concurrent.Callable
• java.security.PrivilegedAction
• java.util.Comparator
• java.io.FileFilter
• java.nio.file.PathMatcher
• java.lang.reflect.InvocationHandler
• java.beans.PropertyChangeListener
• java.awt.event.ActionListener
• javax.swing.event.ChangeListener
JDK1.8中定义的函数式接口:
• 在java.util.function包中