【Java基础】Java8 使用 stream().sorted()对List集合进行排序

简介: Java8 使用 stream().sorted()对List集合进行排序

一、集合对象定义

使用stream().sorted()进行排序,需要该类实现 Comparable 接口,该接口只有一个方法需要实现,如下:

publicintcompareTo(To);

有关compareTo方法的实现说明,请参考:Java 关于重写compareTo方法


集合对象以学生类(Student)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。


我的学生类代码如下:

packagecom.iot.productmanual.controller;
importio.swagger.annotations.ApiModel;
importio.swagger.annotations.ApiModelProperty;
importlombok.AllArgsConstructor;
importlombok.Data;
importlombok.NoArgsConstructor;
importjava.time.LocalDate;
importjava.util.List;
/*** <p>Student此类用于:学生信息实体 </p>* <p>@author:hujm</p>* <p>@date:2023年01月12日 18:36</p>* <p>@remark:注意此处加了Lombok的@Data、@AllArgsConstructor、@NoArgsConstructor注解,所以此类的Getter/Setter/toString/全参构造/无参构造都省略 </p>*/@Data@ApiModel(value="学生信息实体")
@AllArgsConstructor@NoArgsConstructorpublicclassStudentimplementsComparable<Student> {
@ApiModelProperty("姓名")
privateStringname;
@ApiModelProperty("性别 true男 false女")
privateBooleansex;
@ApiModelProperty("年龄")
privateIntegerage;
@ApiModelProperty("身高,单位米")
privateDoubleheight;
@ApiModelProperty("出生日期")
privateLocalDatebirthday;
@OverridepublicintcompareTo(Studentstudent) {
returnthis.age.compareTo(student.getAge());
    }
@OverridepublicStringtoString() {
returnString.format("%s\t\t%s\t\t%s\t\t%s\t\t%s",
this.name, this.sex.toString(), this.age.toString(), this.height.toString(), birthday.toString());
    }
/*** 打印学生信息的静态方法** @param studentList 学生信息列表*/publicstaticvoidprintStudentList(List<Student>studentList) {
System.out.println("【姓名】\t【性别】\t【年龄】\t\t【身高】\t\t【生日】");
System.out.println("-----------------------------------------------------");
studentList.forEach(s->System.out.println(s.toString()));
System.out.println(" ");
    }
}


二、添加测试数据

下面来添加一些测试用的数据,代码如下:

List<Student>studentList=newArrayList<>();
// 添加测试数据,请不要纠结数据的严谨性studentList.add(newStudent("张三", true, 18, 1.75, LocalDate.of(2005, 3, 26)));
studentList.add(newStudent("李四", false, 16, 1.67, LocalDate.of(2007, 8, 30)));
studentList.add(newStudent("王五", true, 23, 1.89, LocalDate.of(2000, 1, 16)));
studentList.add(newStudent("麻六", false, 27, 1.75, LocalDate.of(1996, 9, 20)));
studentList.add(newStudent("刘七", false, 30, 1.93, LocalDate.of(1993, 6, 19)));
studentList.add(newStudent("王八", false, 30, 1.75, LocalDate.of(1993, 6, 19)));

三、升序排序

使用年龄进行升序排序

// 排序之前结果输出Student.printStudentList(studentList);
// 按年龄排序(Integer类型)List<Student>ageAscList=studentList.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList());
// 排序之后结果输出(按年龄升序)Student.printStudentList(ageAscList);

结果如下图:

四、降序排序

使用年龄进行降序排序(使用 reversed() 方法)

// 降序排序// 排序之前结果输出Student.printStudentList(studentList);
List<Student>reversedList=studentList.stream().sorted(Comparator.comparing(Student::getAge).reversed()).collect(Collectors.toList());
// 排序之后结果输出(按年龄降序)Student.printStudentList(reversedList);

结果如下图:

五、多字段排序

使用年龄进行降序排序,年龄相同再使用身高升序排序

// 多字段排序// 排序之前结果输出Student.printStudentList(studentList);
// 使用年龄进行降序排序,年龄相同再使用身高升序排序List<Student>ageHeightList=studentList.stream().sorted(Comparator.comparing(Student::getAge).thenComparing(Student::getHeight)).collect(Collectors.toList());
// 排序之后结果输出(按年龄降序)Student.printStudentList(ageHeightList);

结果如下图:


**本文首发于CSDN,为博主原创文章,如果需要转载,请注明出处,谢谢!**


本文完结!

目录
打赏
0
0
0
0
17
分享
相关文章
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
61 3
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
51 20
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
76 5
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
118 6
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
84 4
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
4月前
|
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
68 2
|
4月前
|
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。

热门文章

最新文章