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