方法引用让你可以重复使用现有的方法定义,并像 Lambda 一样传递它们。
如果一个 Lambda 代表的只是 “直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。

Lambda等效的方法引用
(Apple a) -> a.getWeight()Apple::getWeight
() -> Thread.currentThread().dumpStack()Thread.currentThread()::dumpStack
(str, i) -> str.substring(i)String::substring
(String s) -> System.out.println(s)System.out::println

表-Lambda 及其等效方法引用的例子


如何构造方法引用?

方法引用主要有三类。
1) 指向静态方法的方法引用
2) 指向任意类型实例方法的方法引用
3) 指向现有对象的实例方法引用





图-为三种不同类型的 Lambda 表达式构建方法引用的办法




请注意,还有针对构造函数、数组构造函数和父类调用 (super-call) 的一些特殊形式的方法引用。举一个例子:
比方说想要对一个字符串的List排序,忽略大小写。List的sort方法需要一个Comparator作为参数。Comparator描述了一个具有(T, T) -> int 签名的函数描述符。你可以利用 String 类中预设的 compareToIgnoreCase 方法来定义一个 Lambda 表达式。

利用前面所述的方法, 这个例子可以用方法引用改写成下面的样子:

方法引用的签名必须和上下文类型匹配

发表评论

电子邮件地址不会被公开。 必填项已用*标注