在 Java 8 中,您现在可以使用 Lambda 表达式和方法引用更轻松地传递方法。首先,一些背景知识:功能接口是一个只有一个抽象方法的接口,尽管它可以包含任意数量的默认方法(Java 8中的新功能)和静态方法。lambda 表达式可以快速实现抽象方法,如果您不使用 lambda 表达式,则无需所有不必要的语法。
没有 lambda 表达式:
obj.aMethod(new AFunctionalInterface() {
@Override
public boolean anotherMethod(int i)
{
return i == 982
}
});
使用 lambda 表达式:
obj.aMethod(i -> i == 982);
以下是有关 Lambda 表达式的 Java 教程的摘录:
Lambda 表达式的语法
lambda 表达式由以下内容组成:
-
用逗号分隔的形式参数列表,括在括号中。CheckPerson.test 方法包含一个参数 p,它表示 Person 类的一个实例。
注意:您可以在 lambda 表达式中省略参数的数据类型。此外,如果只有一个参数,则可以省略括号。例如,以下 lambda 表达式也是有效的:
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
箭头令牌,->
-
由单个表达式或语句块组成的正文。此示例使用以下表达式:
p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
如果指定单个表达式,则 Java 运行时将计算该表达式,然后返回其值。或者,您可以使用 return 语句:
p -> {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
return 语句不是表达式;在 lambda 表达式中,必须将语句括在大括号 ({}) 中。但是,您不必将 void 方法调用括在大括号中。例如,下面是一个有效的 lambda 表达式:
email -> System.out.println(email)
请注意,lambda 表达式看起来很像方法声明;您可以将 lambda 表达式视为匿名方法, 即没有名称的方法。
以下是使用 lambda 表达式“传递方法”的方法:
interface I {
public void myMethod(Component component);
}
class A {
public void changeColor(Component component) {
// code here
}
public void changeSize(Component component) {
// code here
}
}
class B {
public void setAllComponents(Component[] myComponentArray, I myMethodsInterface) {
for(Component leaf : myComponentArray) {
if(leaf instanceof Container) { // recursive call if Container
Container node = (Container)leaf;
setAllComponents(node.getComponents(), myMethodInterface);
} // end if node
myMethodsInterface.myMethod(leaf);
} // end looping through components
}
}
class C {
A a = new A();
B b = new B();
public C() {
b.setAllComponents(this.getComponents(), component -> a.changeColor(component));
b.setAllComponents(this.getComponents(), component -> a.changeSize(component));
}
}
通过使用方法引用,类可以进一步缩短,如下所示:C
class C {
A a = new A();
B b = new B();
public C() {
b.setAllComponents(this.getComponents(), a::changeColor);
b.setAllComponents(this.getComponents(), a::changeSize);
}
}