未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java 新特性

  • Java8 新特性

    • Java 8 Lambda 和 Comparator 排序
      • 1. Comparator 排序
      • 2. Lambda 和 Comparator 排序
      • 3. 排序反转
      • 4. Lambda 和 Comparator 和 Stream 排序
    • Java 8 Optional 介绍
    • Java 8 Lambda 表达式介绍
    • Java 8 Stream 流式操作
    • Java 8 LocalDate、LocalDateTime 时间处理介绍
    • Java 8 List 转 Map
    • Java 8 Function 函数接口
    • Java 8 Supplier 函数接口
    • Java 8 Consumer 函数接口
    • Java 8 Predicate 函数接口
    • Java 8 forEach 遍历
    • Java 8 BiFunction 函数接口
    • Java 8 BiPredicate 函数接口
    • Java 8 UnaryOperator 函数接口
  • Java 新特性
  • Java8 新特性
程序猿阿朗
2022-04-06

Java 8 Lambda 和 Comparator 排序

这里将演示 Java 8 中,几种使用 Ladmbda 结合 Comparator 进行 List 排序(升序或降序)的方式。

下面的示例中会用到 Person 类,Person 类的定义如下:

public class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    // toString...
    // get...set...
}
1
2
3
4
5
6
7
8
9
10

# 1. Comparator 排序

Comparator 是 Java 8 之前常用的排序方式,下面是排序 Person 类中的 age 字段的示例。

public static void main(String[] args) {
    List<Person> list = new ArrayList<>();
    list.add(new Person("Chris", 20));
    list.add(new Person("Linda", 10));
    list.add(new Person("Jack", 30));
    Collections.sort(list, new Comparator<Person>() {
    		@Override
    		public int compare(Person o1, Person o2) {
    		    return o1.getAge() - o2.getAge();
    		}
		});
    for (Person person : list) {
        System.out.println(person);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

输出:

Person{name='Linda', age=10}
Person{name='Chris', age=20}
Person{name='Jack', age=30}
1
2
3

这里是一个匿名内部类方式的实现,为了一行排序代码写的代码是不是有点多了?

# 2. Lambda 和 Comparator 排序

public static void main(String[] args) {
    List<Person> list = new ArrayList<>();
    list.add(new Person("Chris", 20));
    list.add(new Person("Linda", 10));
    list.add(new Person("Jack", 30));
    sort(list);
    list.forEach(System.out::println);
}

private static List<Person> sort(List<Person> list) {
    Comparator<Person> byAge = (Person o1, Person o2) -> o1.getAge().compareTo(o2.getAge());
    list.sort(byAge);
    return list;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

输出:

Person{name='Linda', age=10}
Person{name='Chris', age=20}
Person{name='Jack', age=30}
1
2
3

也可以使用 Lambda 结合函数接口来完成 Comparator 的定义操作。

private static List<Person> sort(List<Person> list) {
    Comparator<Person> byAge = Comparator.comparing(Person::getAge);
    list.sort(byAge);
    return list;
}
1
2
3
4
5

输出:

Person{name='Linda', age=10}
Person{name='Chris', age=20}
Person{name='Jack', age=30}
1
2
3

当然也可以进一步简化代码,像下面这样。

list.sort(Comparator.comparing(Person::getAge));
1

当需要排其他字段排序,如 name 字段,可以直接改为。

list.sort(Comparator.comparing(Person::getName));
1

输出:

Person{name='Chris', age=20}
Person{name='Jack', age=30}
Person{name='Linda', age=10}
1
2
3

# 3. 排序反转

下面的示例演示按 age 字段降序和升序的排序方式。

List<Person> list = new ArrayList<>();
list.add(new Person("Chris", 20));
list.add(new Person("Linda", 10));
list.add(new Person("Jack", 30));

list.sort((p1, p2) -> p1.getAge() - p2.getAge());
list.forEach(System.out::println);
System.out.println("--------");

list.sort((p1, p2) -> p2.getAge() - p1.getAge());
list.forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11

输出:

Person{name='Linda', age=10}
Person{name='Chris', age=20}
Person{name='Jack', age=30}
--------
Person{name='Jack', age=30}
Person{name='Chris', age=20}
Person{name='Linda', age=10}
1
2
3
4
5
6
7

也可以用另外的一种方式:

Comparator<Person> comparing = Comparator.comparing(Person::getAge);
list.sort(comparing);
list.forEach(System.out::println);

System.out.println("--------");

list.sort(comparing.reversed());
list.forEach(System.out::println);
1
2
3
4
5
6
7
8

输出:

Person{name='Linda', age=10}
Person{name='Chris', age=20}
Person{name='Jack', age=30}
--------
Person{name='Jack', age=30}
Person{name='Chris', age=20}
Person{name='Linda', age=10}
1
2
3
4
5
6
7

# 4. Lambda 和 Comparator 和 Stream 排序

有时需要使用 stream 的 API,顺便排序可以使用 stream 的 sorted 方法。

List<com.wdbyte.comparator.Person> list = new ArrayList<>();
list.add(new com.wdbyte.comparator.Person("Chris", 20));
list.add(new com.wdbyte.comparator.Person("Linda", 10));
list.add(new com.wdbyte.comparator.Person("Jack", 30));

list.stream()
    .sorted(Comparator.comparing(Person::getAge))
    .forEach(System.out::println);
System.out.println("----------");
list.stream()
    .sorted(Comparator.comparing(Person::getAge).reversed())
    .forEach(System.out::println);
1
2
3
4
5
6
7
8
9
10
11
12

输出:

Person{name='Linda', age=10}
Person{name='Chris', age=20}
Person{name='Jack', age=30}
----------
Person{name='Jack', age=30}
Person{name='Chris', age=20}
Person{name='Linda', age=10}
1
2
3
4
5
6
7

文中的代码存放在:github.com/niumoo/JavaNotes (opens new window)

订阅

文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

文章作者: 程序猿阿朗
文章链接:https://www.wdbyte.com/java8/comparator/
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
#Lambda#Comparator
上次更新: 2022/12/05, 08:18:32
Java 7 Files,Paths,Path 文件操作介绍
Java 8 Optional 介绍

← Java 7 Files,Paths,Path 文件操作介绍 Java 8 Optional 介绍→

最近更新
01
如何搭建一个自己的音乐服务器
12-04
02
JUnit 5 单元测试教程
11-17
03
使用 StringUtils.split 的坑
11-02
更多文章>

提示:评论前请刷新页面,否则评论的可能不是当前文章。

Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式