5.1 方法引用
读者可能已经发现,Lambda表达式有一个常见的用法:Lambda表达式经常调用参数。比如想得到艺术家的姓名,Lambda的表达式如下:
artist -> artist.getName()
这种用法如此普遍,因此Java 8为其提供了一个简写语法,叫作方法引用,帮助程序员重用已有方法。用方法引用重写上面的Lambda表达式,代码如下:
Artist::getName
标准语法为Classname::methodName。需要注意的是,虽然这是一个方法,但不需要在后面加括号,因为这里并不调用该方法。我们只是提供了和Lambda表达式等价的一种结构,在需要时才会调用。凡是使用Lambda表达式的地方,就可以使用方法引用。
构造函数也有同样的缩写形式,如果你想使用Lambda表达式创建一个Artist对象,可能会写出如下代码:
(name, nationality) -> new Artist(name, nationality)
使用方法引用,上述代码可写为:
Artist::new
这段代码不仅比原来的代码短,而且更易阅读。Artist::new立刻告诉程序员这是在创建一个Artist对象,程序员无需看完整行代码就能弄明白代码的意图。另一个要注意的地方是方法引用自动支持多个参数,前提是选对了正确的函数接口。
还可以用这种方式创建数组,下面的代码创建了一个字符串型的数组:
String[]::new
从现在开始,我们将在合适的地方使用方法引用,因此读者很快会看到更多的例子。一开始探索Java 8时,有位朋友告诉我,方法引用看起来“就像在作弊”。他的意思是说,了解如何使用Lambda表达式让代码像数据一样在对象间传递之后,这种直接引用方法的方式就像“作弊”。
放心,这不是在作弊。读者只要记住,每次写出形如x -> foo(x)的Lambda表达式时,和直接调用方法foo是一样的。方法引用只不过是基于这样的事实,提供了一种简短的语法而已。
