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<Car>() {
@Override
public int compare(Car c1, Car c2) {
return c1.getName().compareTo(c2.getName());
}
};
然后使用Collections.sort方法对List<car>排序
Collections.sort(cars, new Comparator<Car>() {
@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<Car> 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<Car> 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<Car> cars4 = Lists.newArrayList(new Car("benci", 10),
new Car("baoma", 12));
cars4.sort(Car::compareByNameThenPrice);
6. 使用多条件排序
我们可以同时将多个比较器串起来:
List<Car> cars5 = Lists.newArrayList(new Car("benci", 10),
new Car("baoma", 12));
cars5.sort(Comparator.comparing(Car::getName)
.thenComparing(Car::getPrice));
7.总结
我们学习了如何使用lambda表达式与Comparator 类来对Java集合进行排序。