java Lambda表达式在一个接口上工作吗?
爪哇7
List<Person> personList = Person.createShortList();
// Sort with Inner Class
Collections.sort(personList, new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return p1.getSurName().compareTo(p2.getSurName());
}
});
爪哇8
Collections.sort(personList, (Person p1, Person p2) ->
p1.getSurName().compareTo(p2.getSurName()));
for (Person p : personList) {
p.printName();
}
如果接口Comparator
有2个方法,而不是只有一个compare
,那么可以使用Lambda吗
比如说
public interface Comparator<T> {
int compare(T o1, T o2);
int compareTest(T o1, T o2);
}
# 1 楼答案
功能接口只需要一种抽象方法,而你的接口却不需要这种方法。但是,您可以为其中一个方法提供默认实现。在这种情况下,它会起作用:
# 2 楼答案
lambda可用于预期实现功能接口的地方。功能接口的定义见JLS§9.8:
所以在你的例子中,不,如果在
Comparator
(compare
和compareTest
)上有两个抽象方法,你不能用lambda实现它例如,这是有效的:
。。。但是如果我们加上^{:
。。。它将不再编译,因为它不再是一个功能接口。(如果我们删除注释,接口会编译(当然),但我们通过lambda使用它不会。)
请注意,我们可以向^{添加一个默认方法:
这没关系,因为界面上只有一个抽象方法