Java8里新引入的函数式编程,在不少场合确实可以减少不少代码行数,书写和阅读还是比较方便的。值得提倡。
但是有些地方看起来可能不像以前那么好懂了,比如下面的代码,对字符串进行排序。其中sort的方法签名是:
1
|
public
static
<T
>
void sort
(T
[
] a, Comparator
<?
super T
> c
)
|
但是,实际用的时候,可以传入一个方法引用,String::compareToIgnoreCase,但是这个写法,语法是正确的。
从传统Java的角度看,是无论如何也想不通的,因为Comparator和String::compareToIgnoreCase的签名是不一样的。
但在这里,传入的是一个方法引用,并不是Comparator接口 ,实际上下面的写法等同于:
1
2 3 |
String
[
] stringArray
=
{
"Barbara",
"James",
"Mary",
"John",
"Patricia", "Robert", "Michael", "Linda" } ; Arrays. sort (stringArray, String ::compareToIgnoreCase ) ; |
等同于下面,如果按照下面的写法,就一目了然了吧,实际上是生成了一个匿名方法,这个匿名方法用compareToIgnoreCase来实现,
上面的写法只是省略了参数a,b 而已。个人感觉为了看起来方便,还不如写成下面的样子。不然有些时候,真不好懂呀。
1
2 3 |
String
[
] stringArray
=
{
"Barbara",
"James",
"Mary",
"John",
"Patricia", "Robert", "Michael", "Linda" } ; Arrays. sort (stringArray, (a,b ) ->a. compareToIgnoreCase (b ) ) ; |