【Java 8 新特性】Java Comparator.comparing | 提取对象属性,按照指定规则排序
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));
对于int
、long
和double
数据类型的排序键,比较器分别有comparingInt
、comparingLong
和comparingDouble
方法。
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.sorted
、List.sort
和Arrays.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 | 提取对象属性,按照指定规则排序相关推荐
- Java 8 新特性:Comparator.naturalOrder | 自然排序
点击关注公众号,实用技术文章及时了解 来源:moonce.blog.csdn.net/article/ details/120324130 naturalOrder是比较器功能接口的静态方法. Jav ...
- 【289期】Java 8 新特性:Comparator.naturalOrder | 自然排序
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每一天进步一点点,是成功的开始... natur ...
- Comparator.comparing嵌套对象倒序以及多重条件排序
一.嵌套对象倒序的正确书写方式 描述:对象A内部封装对象B,根据B的字段做倒排 Comparator<User> ageDescCom = Comparator.comparing(tem ...
- Java 8 新特性 宋红康跟学
Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...
- 七、Java 14 新特性
七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...
- Java 10新特性
Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...
- java自动化测试语言高级之Java 9 新特性
java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...
- java自动化测试语言高级之Java 8 新特性
java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...
- Java 8 新特性之Stream API
1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.stream.*). Stream 是 Java ...
最新文章
- centos 多台 文件夹同步_CentOS7配置rsync实现文件同步
- java中@Qualifier(string)是什么用法
- MATLAB 利用plot 画图,加标题,保存图片
- VS项目中引入dll的方法
- MySQL DBA面试全揭秘
- MFC之ComboBox控件用法
- 如何选择免费网站监测工具?国外mon.itor.us还是国内监控宝!
- 作者:王楠,博士,就职于郑州商品交易所期货及衍生品研究所有限公司。
- Debian下RPM包安装
- hsf 架构_HSF源码剖析 - 汪兴的个人空间 - OSCHINA - 中文开源技术交流社区
- Nginx+keepalive反向代理
- 数据挖掘:模型选择——线性回归
- Android 深入ViewPager补间动画,实现类京东商城首页广告Banner切换效果
- 第六章 PCB 的 DRC 检查、拼版设计及资料输出
- excel身份证号判断男女
- 《紫川》之远东战火 十一卷
- java实现图片拼接
- MySQL报错: Incorrect string value: '\xE5\x85\xA8\xE7\x90\x83...' for column 'cname' at row 1
- 使用viewer实现图片预览
- 俞一帆:5G边缘计算助力工业现场智能