龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

Java函数式编程(九):Comparator(4)

时间:2014-09-27 03:12来源:网络整理 作者:网络 点击:
分享到:
我们还是继续使用上节中的那个例子。按名字排序的话,我们上面是这么写的: 复制代码 代码如下: people.stream() .sorted((person1, person2) - person1.getName().comp

我们还是继续使用上节中的那个例子。按名字排序的话,我们上面是这么写的:

复制代码 代码如下:

people.stream()
.sorted((person1, person2) ->
person1.getName().compareTo(person2.getName()));

和上个世纪的内部类的写法比起来,这种写法简直太简洁了。不过如果用了Comparator类里面的一些函数能让它变得更简单,使用这些函数能够让我们更流畅的表述自己的目的。比如说,要按名字排序的话,我们可以这么写:

复制代码 代码如下:

final Function<Person, String> byName = person -> person.getName();
people.stream()
.sorted(comparing(byName));

这段代码中我们导入了Comparator类的静态方法comparing()。comparing()方法使用传入的lambda表达式来生成一个Comparator对象。也就是说,它也是一个高阶函数,接受一个函数入参并返回另一个函数。除了能让语法变得更简洁外,这样的代码读起来也能更好的表述我们想要解决的实际问题。

有了它,进行多重比较的时候也能变得更加流畅。比如,下面这段按名字和年龄比较的代码就能说明一切:

复制代码 代码如下:

final Function<Person, Integer> byAge = person -> person.getAge();
final Function<Person, String> byTheirName = person -> person.getName();
printPeople("Sorted in ascending order by age and name: ",
people.stream()
.sorted(comparing(byAge).thenComparing(byTheirName))
.collect(toList()));

我们先是创建了两个lambda表达式,一个返回指定人的年龄,一个返回的是他的名字。在调用sorted()方法的时候我们把这两个表达式组合 到了一起,这样就能进行多个属性的比较了。comparing()方法创建并返回了一个按年龄比较的Comparator ,我们再调用这个返回的Comparator上面的thenComparing()方法来创建一个组合的比较器,它会对年龄和名字两项进行比较。下面的输出是先按年龄再按名字进行排序后的结果。

复制代码 代码如下:

Sorted in ascending order by age and name:
John - 20
Jane - 21
Sara - 21
Greg - 35

可以看到,使用lambda表达式和JDK提供的新的工具类,可以很容易的将Comparator的实现进行组合。下面我们来介绍下Collectors。

精彩图集

赞助商链接