java8 lambda 排序_java8新特性(一)使用Lambda表达式集合比较排序

本文介绍了如何使用Java8的Lambda表达式对对象集合进行排序,包括直接使用Lambda、根据getter方法排序、多条件排序以及静态方法排序,展示了Lambda简化代码的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

最近开始在手头的项目中用到了一些java8的新特性,用了感觉不错,特分享记录下。

Lambda表达式,是java语言层次上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据,一种函数式编程的概念。废话不多说,上代码:

在集合比较排序上的应用

我们先创建一个简单的实体类:

public class Staff {

//ID作为唯一标识

private Long id;

private Integer age;

private String name;

public Staff() {

super();

}

public Staff(Long id, Integer age, String name) {

super();

this.id = id;

this.age = age;

this.name = name;

}

...

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((id == null) ? 0 : id.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Staff other = (Staff) obj;

if (id == null) {

if (other.id != null)

return false;

} else if (!id.equals(other.id))

return false;

return true;

}

@Override

public String toString() {

return "Staff [id=" + id + ", age=" + age + ", name=" + name + "]";

}

在java8以前对于对象排序,需要实现匿名比较器来做比较。

List list2 = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(3L, 36, "李六"));

Collections.sort(list2, new Comparator(){

@Override

public int compare(Staff o1, Staff o2) {

return o1.getAge().compareTo(o2.getAge());

}

});

System.out.println(list2.get(0));

Staff [id=1, age=18, name=张三]

使用Lambda表达式实现

@Test

public void testLambdaSorted() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(3L, 36, "李六"));

staffs.sort((Staff o1, Staff o2) -> o1.getAge().compareTo(o2.getAge()));

assertThat(staffs.get(0), equalTo(new Staff(1L, 18, "张三")));

}

我们可以省略Staff类的指定,编译器能帮自动推定。

staffs.sort((o1, o2) -> o1.getAge().compareTo(o2.getAge()));

@Test

public void testLambdaSorted2() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(3L, 36, "李六"));

staffs.sort((o1, o2) -> o1.getAge().compareTo(o2.getAge()));

assertThat(staffs.get(0), equalTo(new Staff(1L, 18, "张三")));

}

要翻转排序?

@Test

public void testLambdaSortReversed() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(3L, 36, "李六"));

Comparator comparator = (o1, o2) -> o1.getAge().compareTo(o2.getAge());

staffs.sort(comparator.reversed());

assertThat(staffs.get(0), equalTo(new Staff(1L, 18, "张三")));

}

可以直接根据类的getter方法来排序

@Test

public void testLambdaSortedByGetter() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(3L, 36, "李六"));

Collections.sort(staffs, Comparator.comparing(Staff::getAge));

assertThat(staffs.get(0), equalTo(new Staff(1L, 18, "张三")));

}

多条件排序?写一个根据名字排序,同名则再比较年龄的例子:

@Test

public void testLambdaSortedByMultipleCondition() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(4L, 17, "张三"),

new Staff(3L, 36, "李六"));

staffs.sort((lo, ro) -> {

if (lo.getName().equals(ro.getName())) {

return lo.getAge() - ro.getAge();

} else {

return lo.getName().compareTo(ro.getName());

}

});

assertThat(staffs.get(0), equalTo(new Staff(4L, 17, "张三")));

}

使用静态方法排序

1、先在Staff新建一个静态方法:

public static int compareByNameThenAge(Staff lo, Staff ro) {

if (lo.name.equals(ro.name)) {

return lo.age - ro.age;

} else {

return lo.name.compareTo(ro.name);

}

}

2、然后就可以用这个方法进行排序了

staffs.sort(Staff :: compareByNameThenAge);

@Test

public void testLambdaSortedByStaticMethod() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(4L, 17, "张三"),

new Staff(3L, 36, "李六"));

staffs.sort(Staff :: compareByNameThenAge);

assertThat(staffs.get(0), equalTo(new Staff(4L, 17, "张三")));

}

不愿写这个多条件比较方法?可以,JAVA8开始Comparator支持链式排序

staffs.sort(Comparator.comparing(Staff::getName).thenComparing(Staff::getAge));

@Test

public void testLambdaSortedByChainGetter() {

List staffs = Arrays.asList(

new Staff(2L, 25, "王五"),

new Staff(1L, 18, "张三"),

new Staff(4L, 17, "张三"),

new Staff(3L, 36, "李六"));

staffs.sort(Comparator.comparing(Staff::getName).thenComparing(Staff::getAge));

assertThat(staffs.get(0), equalTo(new Staff(4L, 17, "张三")));

}

结语:

这篇文章演示了一个列表排序可以使用java 8 Lambda表达式->的语法糖,以及如何实现更加简洁明了的语义排序代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值