写点什么

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

作者:No8g攻城狮
  • 2023-01-13
    河南
  • 本文字数:1945 字

    阅读完需:约 6 分钟

一、集合对象定义

使用 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@NoArgsConstructorpublic 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,为博主原创文章,如果需要转载,请注明出处,谢谢!


本文完结!

发布于: 刚刚阅读数: 3
用户头像

No8g攻城狮

关注

熟了再告诉你 2022-12-03 加入

热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长

评论

发布
暂无评论
【Java基础】Java8 使用 stream().sorted()对List集合进行排序_java;_No8g攻城狮_InfoQ写作社区