Java8的Lambda和排序
目录
Java 8 lambda
令人惊奇的一个应用,我们可以实现一个Comparators
来实现各种排序。看下面案例:
static class Person {final String firstName; final String lastName; Person(String firstName, String lastName) {this.firstName = firstName; this.lastName = lastName; } @Overridepublic String toString() {return "Person{" +"firstName='" + firstName + '\'' +", lastName='" + lastName + '\'' +'}'; }}
【Java8的Lambda和排序】Person的数据有:
List people =Arrays.asList(new Person("Jane", "Henderson"),new Person("Michael", "White"),new Person("Henry", "Brighton"),new Person("Hannah", "Plowman"),new Person("William", "Henderson"));
我们希望根据名字排序(
last name
),然后再根据姓(first name
)排序。在Java 7之前,我们通常是通过实现一个Comparator:
people.sort(new Comparator() {@Overridepublic int compare(Person o1, Person o2) {int result = o1.lastName.compareTo(o2.lastName); if (result == 0)result = o1.firstName.compareTo(o2.firstName); return result; }}); people.forEach(System.out::println);
而在Java 8中,我们可以使用lambda替代匿名函数,如下:
Comparator c = (p, o) -> p.lastName.compareTo(o.lastName); c = c.thenComparing((p, o) -> p.firstName.compareTo(o.firstName)); people.sort(c); people.forEach(System.out::println);
在这里,
Lambda
表达式 (p, o) -> p.lastName.compareTo(o.lastName)
替代之前的匿名函数new Comparator() {}
因为
Java
编译器并不能推迟对Lambda
表达式类型判断,比如延迟到将comparator
传递到sort()
方法,因此使得我们进行链式Comparator
书写有点困难,比如我们想写成如下:
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName)).thenComparing((p, o) -> p.firstName.compareTo(o.firstName))
换句话说,类型判断是从左到右,而不是从右到左,我们可以通过创建一个泛型来进行类型推断:
class Utils {staticComparator compare() {return (e1, e2) -> 0; }}
通过上面的compare()方法,我们可以书写流畅的comparator链:
people.sort(Utils.compare().thenComparing((p, o) ->p.lastName.compareTo(o.lastName)).thenComparing((p, o) ->p.firstName.compareTo(o.firstName))); people.forEach(System.out::println);
到此这篇关于Java8的Lambda和排序的文章就介绍到这了,更多相关Java Lambda和排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量