java 8 排序_Java8的Lambda和排序

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;

}

@Override

public String toString() {

return "Person{" +

"firstName='" + firstName + '\'' +

", lastName='" + lastName + '\'' +

'}';

}

}

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() {

@Override

public 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 {

static Comparator 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 Friday系列,源码Gihub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值