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

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

一、集合对象定义

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

public int compareTo(T o);

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

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

我的学生类代码如下:

package com.iot.productmanual.controller;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.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
@NoArgsConstructor
public class Student implements Comparable<Student> {
    @ApiModelProperty("姓名")
    private String name;
    @ApiModelProperty("性别 true男 false女")
    private Boolean sex;
    @ApiModelProperty("年龄")
    private Integer age;
    @ApiModelProperty("身高,单位米")
    private Double height;
    @ApiModelProperty("出生日期")
    private LocalDate birthday;
    @Override
    public int compareTo(Student student) {
        return this.age.compareTo(student.getAge());
    }
    @Override
    public String toString() {
        return String.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 学生信息列表
     */
    public static void printStudentList(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 = new ArrayList<>();
// 添加测试数据,请不要纠结数据的严谨性
studentList.add(new Student("张三", true, 18, 1.75, LocalDate.of(2005, 3, 26)));
studentList.add(new Student("李四", false, 16, 1.67, LocalDate.of(2007, 8, 30)));
studentList.add(new Student("王五", true, 23, 1.89, LocalDate.of(2000, 1, 16)));
studentList.add(new Student("麻六", false, 27, 1.75, LocalDate.of(1996, 9, 20)));
studentList.add(new Student("刘七", false, 30, 1.93, LocalDate.of(1993, 6, 19)));
studentList.add(new Student("王八", 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,为博主原创文章,如果需要转载,请注明出处,谢谢!

本文完结!


相关文章
|
1月前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
5月前
|
存储 安全 Java
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
93 3
|
1月前
|
Java
Java LinkedList集合的深度剖析
总的来说,我希望像说故事一样讲解Java LinkedList集合的使用和实现原理,让有些许枯燥的编程知识变得趣味盎然。在这个“公交车”故事中,你不仅熟悉了LinkedList集合的实现和使用,而且还更深入地理解了数据结构中的链表。链表可能会因为插入和删除的便利性而被选用,虽然它的查找效率并不高,但是在很多场景中仍然十分有效。这就像公交车,虽然它速度不快,但却是城市出行的重要工具。
59 8
|
1月前
|
存储 安全 Java
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
64 0
|
2月前
|
Java
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
|
5月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
98 5
|
6月前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
125 4
|
11月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1180 1
|
10月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
136 1
|
10月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。

热门文章

最新文章