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<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集合进行排序。

    原文作者:林林发
    原文地址: https://zhuanlan.zhihu.com/p/34544961
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞