概述
Java 8 引入了新特性lambda表达式。Lambda表达式是一种不隶属于任何类的匿名方法。其可以使用在函数接口(functional interface)定义的变量。函数接口是一种只包含一个抽象方法(abstract method),同时可以包含多个默认方法(default method)和静态方法(static method)的接口。因此,lambda表达式也可以看做另一种形式的匿名类。
方法引用是一个与Lambda表达式相关的重要特性。可以同lambda一样,将方法引用传递给函数接口。方法引用的形式如:
Object::methodName
双引号::用来表示引用一个方法。
方法引用分类
有四种类型的方法引用。具体如下
类型 | 方法引用语法 | Lambda表达式语法 |
---|---|---|
引用静态方法(Reference to a static method ) | ClassName::staticMethodName | (args) -> ClassName.staticMethodName(args) |
对已存在对象的实例方法的引用(Reference to an instance method of an existing object) | object::instanceMethodName | (args) -> object.instanceMethodName(args) |
引用特定类型的任意对象的实例方法(Reference to an instance method of an arbitrary object of a particular type) | ClassName::instanceMethodName | (arg0,rest) -> arg0.instanceMethodName(rest) Note: arg0 is of type ClassName |
引用构造器(Reference to a constructor) | ClassName::new | (args) -> new ClassName(args) |
其中,引用特定类型的任意对象的实例方法可能相对难以理解,下面本文将通过实例详细解读这四种方法引用类型。
引用静态方法
下述代码通过定义一个函数接口interface IntPredicate,该接口有一个抽象方法check()。check()方法接受一个类型为int参数,且返回值为类型boolean。IntPredicatesChecker类定义了两个静态方法。MethodRef类则有一个numCheck()方法,第一个参数为函数接口IntPredicate类型,第二个参数为int。 本实例通过numCheck的第一个参数分别接受lambda和静态方法引用来说明静态方法引用的使用。
public class MethodRef {
public MethodRef() {
}
// 该方法将函数接口作为第一个参数
public boolean numCheck(IntPredicate p, int n) {
return p.check(n);
}
public static void main(String[] args) {
MethodRef demo = new MethodRef();
int num = 11;
// 使用lambda 表达式检查number是否偶数
IntPredicate lb1 = number -> (number % 2) == 0;
boolean result = demo.numCheck(lb1, num);
System.out.println("Using lambda expression: " + num + " is even: " + result);
// IntPredicatesChecker 的isEven方法作为静态方法引用传递给numCheck()
result = demo.numCheck(IntPredicatesChecker::isEven, num);
System.out.println("Using static method reference: " + num + " is even: " + result);
// 使用lambda表达式检查number是否为正数
IntPredicate lb2 = number -> number > 0;
result = demo.