Java Comparator.comparing | 提取对象属性,按照指定规则排序

  • Comparator.comparing
  • Comparator.comparingInt
  • Comparator.comparingLong
  • Comparator.comparingDouble
  • 参考文献

comparing是比较器功能接口的静态方法。

Comparator.comparing方法在Java 8中被引入。

Comparator.comparing接受一个函数,该函数从给定类型中提取一个可比较的排序键,并返回一个通过该排序键进行比较的比较器。

Comparator.comparing有两种形式。

1.

static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)

我们需要传递一个函数,它将从一个类型T中提取一个可比较的排序键,并返回一个通过该排序键进行比较的比较器。

查找示例代码。

Comparator<Student> nameComparator = Comparator.comparing(Student::getName);

2.

static <T,U> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)

我们需要传递一个函数(Function )和一个比较器(Comparator)。该方法将从一个类型T中提取一个排序键,并返回一个比较器,使用指定的比较器对该排序键进行比较。

查找示例代码。

Comparator<Student> nameComparator = Comparator.comparing(Student::getName, (s1, s2) -> s2.compareTo(s1));

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

Comparator.comparing

这里我们将提供Comparator.comparing方法的例子。

找到一个将实现Comparable接口的类,并定义compareTo方法。

School.java

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

创建另一个类,我们将在其中创建School类。

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(101, "PQ College"));Student s2 = new Student("Shyam", 22, 3252, 65.80, new School(103, "RS College"));Student s3 = new Student("Mohan", 19, 1459, 65.20, new School(102, "AB College"));Student s4 = new Student("Mahesh", 20, 4450, 70.25, new School(104, "CD College"));List<Student> list = Arrays.asList(s1, s2, s3, s4);return list;}
}

现在找到Comparator.comparing方法的例子。

ComparingDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparingDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Comparator<Student> schoolComparator1 = Comparator.comparing(Student::getSchool);Collections.sort(list, schoolComparator1);list.forEach(s->System.out.print(s.getName() + "-" + s.getSchool().getSname() + " | "));System.out.println("\n-------------------");    Comparator<Student> schoolComparator2 = Comparator.comparing(Student::getSchool, (sch1, sch2) -> sch1.getCode() - sch2.getCode());Collections.sort(list, schoolComparator2);list.forEach(s->System.out.print(s.getName() + "-" + s.getSchool().getCode() + " | "));System.out.println("\n-------------------");    Comparator<Student> nameComparator1 = Comparator.comparing(Student::getName); Collections.sort(list, nameComparator1);list.forEach(s->System.out.print(s.getName() + " "));System.out.println("\n-------------------");Comparator<Student> nameComparator2 = Comparator.comparing(Student::getName, (s1, s2) -> s2.compareTo(s1));     Collections.sort(list, nameComparator2);list.forEach(s->System.out.print(s.getName() + " "));    }
}

输出

Shyam-RS College | Ram-PQ College | Mahesh-CD College | Mohan-AB College |
-------------------
Ram-101 | Mohan-102 | Shyam-103 | Mahesh-104 |
-------------------
Mahesh Mohan Ram Shyam
-------------------
Shyam Ram Mohan Mahesh

在上面的例子中,我们使用Collections.sort对集合进行排序。我们也可以使用Stream.sortedList.sortArrays.sort来使用比较器对集合进行排序。

Comparator.comparingInt

comparingInt方法声明:

static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)

它接受一个从类型T中提取一个int排序键的函数,并返回一个通过该排序键进行比较的比较器。

找到这个例子。

ComparingIntDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparingIntDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Collections.sort(list, Comparator.comparingInt(Student::getAge));list.forEach(s->System.out.print(s.getAge() + " "));    }
}

输出

18 19 20 22

Comparator.comparingLong

comparingLong方法声明:

static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)

它接受一个从类型T中提取一个long排序键的函数,并返回一个通过该排序键进行比较的比较器。

ComparingLongDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparingLongDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Collections.sort(list, Comparator.comparingLong(Student::getHomeDistance));list.forEach(s->System.out.print(s.getHomeDistance() + " "));           }
}

输出

1459 3252 3455 4450

Comparator.comparingDouble

comparingDouble方法声明:

static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)

它接受一个从类型T中提取一个double排序键的函数,并返回一个通过该排序键进行比较的比较器。

ComparingDoubleDemo.java

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ComparingDoubleDemo {public static void main(String[] args) {List<Student> list = Student.getStudentList();Collections.sort(list, Comparator.comparingDouble(Student::getWeight));list.forEach(s->System.out.print(s.getWeight() + " "));           }
}

输出

60.75 65.2 65.8 70.25

参考文献

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

【Java 8 新特性】Java Comparator.comparing | 提取对象属性,按照指定规则排序相关推荐

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

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

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

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

  3. Comparator.comparing嵌套对象倒序以及多重条件排序

    一.嵌套对象倒序的正确书写方式 描述:对象A内部封装对象B,根据B的字段做倒排 Comparator<User> ageDescCom = Comparator.comparing(tem ...

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

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

  5. 七、Java 14 新特性

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

  6. Java 10新特性

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

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

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

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

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

  9. Java 8 新特性之Stream API

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

最新文章

  1. centos 多台 文件夹同步_CentOS7配置rsync实现文件同步
  2. java中@Qualifier(string)是什么用法
  3. MATLAB 利用plot 画图,加标题,保存图片
  4. VS项目中引入dll的方法
  5. MySQL DBA面试全揭秘
  6. MFC之ComboBox控件用法
  7. 如何选择免费网站监测工具?国外mon.itor.us还是国内监控宝!
  8. 作者:王楠,博士,就职于郑州商品交易所期货及衍生品研究所有限公司。
  9. Debian下RPM包安装
  10. hsf 架构_HSF源码剖析 - 汪兴的个人空间 - OSCHINA - 中文开源技术交流社区
  11. Nginx+keepalive反向代理
  12. 数据挖掘:模型选择——线性回归
  13. Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果
  14. 第六章 PCB 的 DRC 检查、拼版设计及资料输出
  15. excel身份证号判断男女
  16. 《紫川》之远东战火 十一卷
  17. java实现图片拼接
  18. MySQL报错: Incorrect string value: '\xE5\x85\xA8\xE7\x90\x83...' for column 'cname' at row 1
  19. 使用viewer实现图片预览
  20. 俞一帆:5G边缘计算助力工业现场智能

热门文章

  1. Java 数据库 课设 职工工资管理系(源代码)
  2. 什么是4D(DRG、DLG、DOM、DEM)数据?
  3. 使用G2O解决优化问题的简单例子
  4. 图片爬虫,手把手教你Python多线程下载获取图片
  5. 211安徽大学大数据与统计学院成立!安徽省属高校首家!
  6. 微软的巨屏平板Surface Hub于7月1日接受24国预定
  7. 分页插件Pagehelper
  8. sqlines数据迁移
  9. mysql忘记root密码?
  10. 关于新浪短链接多个参数问题