不,您无法实现此目的,因为必须是功能接口。功能接口是只包含一个抽象方法的接口。除了抽象方法之外,它还可以包含零个或多个默认方法和/或静态方法。由于函数接口只包含一个抽象方法,因此在使用 lambda 表达式实现该方法时,可以省略该方法的名称。例如,请考虑以下接口:ClassA
interface Predicate<T> {
boolean test(T t);
}
此接口的目的是提供一个方法,该方法对类的对象进行操作并返回 .你可以有一个方法,它采用一个类的实例,该实例实现如下定义的接口:T
boolean
public void printImportantData(ArrayList<Data> dataList, Predicate<Data> p) {
for (Data d : dataList) {
if (p.test(d)) {
System.out.println(d);
}
}
}
其中类可以像以下方法一样简单:Data
public class Data {
public int value;
}
现在,您可以按如下方式调用上述方法:
printImportantData(al, (Data d) -> { return d.value > 1; });
请注意,该方法在此处没有名称。这是可能的,因为接口只有一个抽象方法,因此编译器可以找出名称。这可以缩短为:
printImportantData(al, (Data d) -> d.value > 1);
请注意,此处没有大括号,也没有返回关键字。这是可能的,因为该方法返回一个布尔值,并且表达式也返回一个布尔值。因此,编译器能够确定此表达式的值是从该方法返回的。这可以进一步缩短为:d.value > 1
printImportantData(al, d -> d.value > 1);
请注意,没有 的类型声明 !编译器可以找出所需的所有信息,因为接口只有一个抽象方法,而该方法只有一个参数。因此,您不需要在代码中编写所有这些内容。
将上述方法与旧的Java 7样式进行比较,使用内部类有效地执行相同的操作:d
printImportantData(al, new Predicate<Data>() {
public boolean test(Data d) {
return d.value > 1;
}
});