方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。

当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。方法引用是一种更简洁易懂的Lambda表达式。

方法引用的唯一用途是支持Lambda的简写。方法引用提高了代码的可读性,也使逻辑更加清晰。

静态方法引用

语法:

1
ContainingClass::methodName

等价于:

1
2
3
x -> ContainingClass.methodName(x)
//OR
() -> ContainingClass.methodName()

示例:通过 Stream API 找出用户 List 中是否包含真实用户

1
boolean isReal = list.stream().anyMatch(u -> User.isRealUser(u));

anyMatch() 方法中的lambda表达式只是调用User类的静态方法isRealUser(User user), 所以可以用对静态方法的引用代替:

1
boolean isReal = list.stream().anyMatch(User::isRealUser);

实例对象的方法引用

语法:

1
containingInstance::methodName

等价于:

1
2
3
x -> containingInstance.methodName(x)
//OR
() -> containingInstance.methodName()

以下代码通过调用 User 类中的 isLegalName(String string) 方法检查输入参数是否合法:

1
2
User user = new User();
boolean isLegalName = list.stream().anyMatch(user::isLegalName);

构造方法引用

语法:

1
ClassName::new

等价于:

1
() -> new ClassName()

构造方法是 Java 中的特殊方法,通过使用 new 作为方法名称同样可以在使用方法引用的场景下调用它:

1
Stream<User> stream = list.stream().map(User::new);