Java8的Lambda和排序

网友投稿 195 2022-11-25

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的数据有:

Lishttp://t 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 nhttp://ame)排序。

在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);

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:福音Type-C多功能扩展坞成为了电脑必然的选择
下一篇:CDH6.3.2 集成 Freeipa 的kerberos
相关文章

 发表评论

暂时没有评论,来抢沙发吧~