Java Comparator.thenComparing | 添加次级排序方式

  • Comparator.thenComparing
  • Comparator.thenComparingInt
  • Comparator.thenComparingLong
  • Comparator.thenComparingDouble
  • 参考文献

thenComparing是比较器功能接口的默认方法。

Comparator.thenComparing方法是在Java 8中引入的。

Comparator.thenComparing返回一个词表顺序的比较器,该比较器被一个比较器实例调用,使用一组排序键对项目进行排序。

当这个比较器比较两个元素相等时,thenComparing方法决定了顺序。

我们可以多次使用Comparator.thenComparing

当我们想通过排序键组来确定元素的顺序时,它很有用。

对于intlongdouble数据类型的排序键,比较器分别有thenComparingIntthenComparingLongthenComparingDouble默认方法。

Comparator.thenComparing

thenComparing有以下几种形式。

1.

default Comparator<T> thenComparing(Comparator<? super T> other)

它返回一个字典顺序比较器和另一个比较器。找到代码片段。

Comparator<Student> compByStdName = Comparator.comparing(Student::getName);
Comparator<Student> schoolComparator1 = Comparator.comparing(Student::getAge) //sort by student age.thenComparing(compByStdName); //then sort by student name

首先,比较器将按照学生年龄对学生集合进行排序,如果某些学生的年龄相同,那么将按照他们的名字进行排序。

2.

default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor)

返回一个字典顺序比较器,其中包含一个提取Comparable排序键的函数。找到代码片段。

Comparator<Student> schoolComparator2 = Comparator.comparing(Student::getSchool) //sort by school natural ordering i.e. city.thenComparing(Student::getAge) //then sort by student age.thenComparing(Student::getName); //then sort by student name

首先,学生的集合将按照他们各自的学校的自然顺序进行排序,如果一些学生根据他们的学校排序是相同的,那么这些学生将按照他们各自的年龄进行排序,如果年龄也是相同的,那么他们将按照他们的名字进行排序。

3.

default <U> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)

它返回一个词表顺序的比较器,该比较器带有一个函数,可以提取一个键与给定的比较器进行比较。查找代码片段。

Comparator<Student> schoolComparator3 = Comparator.comparing(Student::getSchool) //sort by school natural ordering i.e. city.thenComparing(Student::getSchool, (school1, school2) -> school1.getSname().compareTo(school2.getSname())) //then sort by school name .thenComparing(Student::getAge) //then sort by student age.thenComparing(Student::getName); //then sort by student name

首先,学生的集合将按他们各自的学校的自然顺序进行排序(即在我们的演示中按学校所在城市),然后如果学生在同一学校所在城市,他们将按各自的学校名称进行排序,如果学生在同一学校名称,他们将按年龄进行排序,如果学生在同一年龄,他们将按名字进行排序。

示例

School.java

public class School implements Comparable<School> {private String sname;private String city;  public School(String sname, String city) {this.sname = sname;this.city = city;}public String getSname() {return sname;}public String getCity() {return city;}@Overridepublic int compareTo(School s) {return s.getCity().compareTo(city);}
}

Student.java

import java.util.Arrays;
import java.util.List;
public class Student {private String name;private int age;private long homeDistance;private double weight;private School school;public Student(String name, int age, long homeDistance, double weight, School school) {this.name = name;this.age = age;this.homeDistance = homeDistance;this.weight = weight;this.school = school;}public String getName() {return name;}public int getAge() {return age;}public long getHomeDistance() {return homeDistance;}public double getWeight() {return weight;}public School getSchool() {return school;}public static List<Student> getStudentList() {Student s1 = new Student("Ram", 18, 3455, 60.75, new School("AB College", "Noida"));Student s2 = new Student("Shyam", 22, 3252, 65.80, new School("RS College", "Gurugram"));Student s3 = new Student("Mohan", 18, 1459, 65.20, new School("AB College", "Noida"));Student s4 = new Student("Mahesh", 22, 4450, 70.25, new School("RS College", "Gurugram"));List<Student> list = Arrays.asList(s1, s2, s3, s4);return list;}
}

ThenComparingDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ThenComparingDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();System.out.println("--------Example-1---------"); Comparator<Student> compByStdName = Comparator.comparing(Student::getName);Comparator<Student> schoolComparator1 = Comparator.comparing(Student::getAge) //sort by student age.thenComparing(compByStdName); //then sort by student name   Collections.sort(list, schoolComparator1);list.forEach(s->System.out.println(s.getName() + "-" + s.getAge()));System.out.println("--------Example-2---------");   Comparator<Student> schoolComparator2 = Comparator.comparing(Student::getSchool) //sort by school natural ordering i.e. city.thenComparing(Student::getAge) //then sort by student age.thenComparing(Student::getName); //then sort by student name   Collections.sort(list, schoolComparator2);list.forEach(s->System.out.println(s.getName() + "-" + s.getAge()+ "-" + s.getSchool().getCity()));System.out.println("--------Example-3---------");    Comparator<Student> schoolComparator3 = Comparator.comparing(Student::getSchool) //sort by school natural ordering i.e. city.thenComparing(Student::getSchool, (school1, school2) -> school1.getSname().compareTo(school2.getSname())) //then sort by school name .thenComparing(Student::getAge) //then sort by student age.thenComparing(Student::getName); //then sort by student name Collections.sort(list, schoolComparator3);list.forEach(s->System.out.println(s.getName() + "-" + s.getAge()+ "-" + s.getSchool().getSname() + "-" + s.getSchool().getCity()));}
}

输出

--------Example-1---------
Mohan-18
Ram-18
Mahesh-22
Shyam-22
--------Example-2---------
Mohan-18-Noida
Ram-18-Noida
Mahesh-22-Gurugram
Shyam-22-Gurugram
--------Example-3---------
Mohan-18-AB College-Noida
Ram-18-AB College-Noida
Mahesh-22-RS College-Gurugram
Shyam-22-RS College-Gurugram

Comparator.thenComparingInt

找到thenComparingInt方法的声明。

default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)

它返回一个字典顺序比较器,其中包含一个提取int排序键的函数。找到例子。

ThenComparingIntDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ThenComparingIntDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Comparator<Student> comparator = Comparator.comparing(Student::getName, (s1, s2) -> s1.charAt(0) - s2.charAt(0)).thenComparingInt(Student::getAge);Collections.sort(list, comparator);list.forEach(s->System.out.println(s.getName() + "-" + s.getAge()));    }
}

输出

Mohan-18
Mahesh-22
Ram-18
Shyam-22

Comparator.thenComparingLong

找到thenComparingLong方法的声明。

default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)

它返回一个字典顺序比较器,其中包含一个提取long排序键的函数。找到例子。

ThenComparingLongDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ThenComparingLongDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Comparator<Student> comparator = Comparator.comparing(Student::getName, (s1, s2) -> s1.charAt(0) - s2.charAt(0)).thenComparingLong(Student::getHomeDistance);Collections.sort(list, comparator);list.forEach(s->System.out.println(s.getName() + "-" + s.getHomeDistance()));  }
}

输出

Mohan-1459
Mahesh-4450
Ram-3455
Shyam-3252

Comparator.thenComparingDouble

找到thenComparingDouble的方法声明。

default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)

它返回一个字典顺序比较器,其中包含一个提取double排序键的函数。找到例子。

ThenComparingDoubleDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ThenComparingDoubleDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Comparator<Student> comparator = Comparator.comparing(Student::getName, (s1, s2) -> s1.charAt(0) - s2.charAt(0)).thenComparingDouble(Student::getWeight);Collections.sort(list, comparator);list.forEach(s->System.out.println(s.getName() + "-" + s.getWeight()));         }
}

输出

Mohan-65.2
Mahesh-70.25
Ram-60.75
Shyam-65.8

参考文献

【1】Interface Comparator
【2】Java Comparator.comparing
【3】Java Comparator.thenComparing

【Java 8 新特性】Java Comparator.thenComparing | 添加次级排序方式相关推荐

  1. Java 8 新特性:Comparator.naturalOrder | 自然排序

    点击关注公众号,实用技术文章及时了解 来源:moonce.blog.csdn.net/article/ details/120324130 naturalOrder是比较器功能接口的静态方法. Jav ...

  2. 【289期】Java 8 新特性:Comparator.naturalOrder | 自然排序

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... natur ...

  3. Java 8 新特性 宋红康跟学

    Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...

  4. Java 10新特性

    Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...

  5. java自动化测试语言高级之Java 8 新特性

    java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...

  6. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  7. java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...

  8. Java 8 新特性之Stream API

    1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.stream.*). Stream 是 Java ...

  9. Java 8 新特性——实践篇

    Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的学生对象里各种成绩进行过滤时,比如大于85分获得A的学生集合,最初的方式是写不同的方法处理不同的科目成绩过滤: ...

最新文章

  1. 青龙依赖环境一键安装部署
  2. 哈希表的实现(取余法)
  3. Create Digital Engagement on Multiple Channels
  4. 初等数论--同余--MILLER-RABIN素性检测算法优化
  5. HTML/CSS——子元素相对于父元素固定定位解决方案
  6. C语言字符5,c语言总览5:字符输入和输出
  7. Vue生命周期学习总结
  8. visa虚拟卡生成器_虚拟信用卡,额度6万!无需面签即可办理
  9. Unity零基础到入门 ☀️| 学会这些Unity常用组件,Unity中必备组件技能学习!
  10. 射频识别(RFID)
  11. 软件工程阶段性总结(二)——软件计划和需求分析
  12. php fpm 504,php为什么会出现504错误
  13. 蚂蚁金服 RPC 框架 Sofa-Bolt 结构分析
  14. Actor编程模型——简介
  15. 班级日常工作管理系统
  16. python3 规则引擎_Ilog、Drools、Jess规则引擎的Rule Language 对比
  17. 笔记本电脑同时连接内外网
  18. 什么是集合,集合的定义,集合与数组的区别,怎么创建一个集合?
  19. uboot配置,编译,移植
  20. 2021 第三届浙江省高职院校新生联赛

热门文章

  1. 广西柳州生活垃圾分类试点实行积分兑礼 厨余垃圾变肥料
  2. 带你实现开发者头条(二) 实现左滑菜单
  3. 算法整理八——回溯算法
  4. 简单的电子词典 因手机问题未图
  5. 半导体材料:GaN(氮化镓)的详细介绍
  6. 每日一题系列:淘宝网店
  7. 人人都可直播带货,即构科技携手万商之家打造低门槛直播服务平台
  8. 自动化测试解决了什么问题,看看这些行业大牛给出的回答
  9. 传统机器学习算法优缺点总结
  10. 【C++】STL map 与 multimap 用法和区别