用java中用类方法编写排序_Java8 使用lambda表达式编写比较器对集合排序

1.概述

Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据。

在最简单的形式中,一个lambda可以由用逗号分隔的参数列表、–>符号与函数体三部分表示。例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

本文主要讲解如果利用lambda表达式来编写比较器对集合进行排序。

首先,我们定义一个实体类:

public class Car {

private String name;

private int price;

public Car() {

super();

}

public Car(String name, int price) {

super();

this.name = name;

this.price = price;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getPrice() {

return price;

}

public void setPrice(int price) {

this.price = price;

}

}

2. Java7排序方法

Java 7及以前我们通常通过创建内部匿名类用于排序 :

new Comparator() {

@Override

public int compare(Car c1, Car c2) {

return c1.getName().compareTo(c2.getName());

}

};

然后使用Collections.sort方法对List排序

Collections.sort(cars, new Comparator() {

@Override

public int compare(Car c1, Car c2) {

return c1.getName().compareTo(c2.getName());

}

});

3. 用lambda表达式排序

通过lambda表达式,我们可以绕过内部匿名类:

(Car c1, Car c2) -> c1.getName().compareTo(c2.getName());

具体如下:

List cars2 = Lists.newArrayList(new Car("benci", 10),

new Car("baoma", 12));

cars2.sort((Car c1, Car c2) -> c1.getName().compareTo(c2.getName()));

注意:我们现在使用Java8中在java.util.List 新sortAPI代替了以前的Collections.sort API

4. 使用无类型声明lambda表达式排序

事实上,可以省略这里的lambda参数的类型声明,编译器可以从列表的类属性推测出来。

(c1, c2) -> c1.getName().compareTo(c2.getName())

具体如下:

List cars3 = Lists.newArrayList(new Car("benci", 10),

new Car("baoma", 12));

cars3.sort((c1, c2) -> c1.getName().compareTo(c2.getName()));

5. 静态方法引用

lambda表达式表示在函数接口中定义的匿名函数。

方法引用使用现有方法创建lambda表达式。

方法引用的一般语法是

Qualifier::MethodName

我们用

cars4.sort(Car::compareByNameThenPrice);

在Car中加入静态方法:

public static int compareByNameThenPrice(Car car1, Car car2) {

if (car1.name.equals(car2.name)) {

return car1.price - car2.price;

} else {

return car1.name.compareTo(car2.name);

}

}

具体:

List cars4 = Lists.newArrayList(new Car("benci", 10),

new Car("baoma", 12));

cars4.sort(Car::compareByNameThenPrice);

6. 使用多条件排序

我们可以同时将多个比较器串起来:

List cars5 = Lists.newArrayList(new Car("benci", 10),

new Car("baoma", 12));

cars5.sort(Comparator.comparing(Car::getName)

.thenComparing(Car::getPrice));

7.总结

我们学习了如何使用lambda表达式与Comparator 类来对Java集合进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值