JDK8对List对象根据属性排序

文章目录

  • JDK8对List对象根据属性排序
  • [1. 被排序字段为null或者空时候报错](#1. 被排序字段为null或者空时候报错)
  • [2. 使用Stream流排序](#2. 使用Stream流排序)
    • [2.1 根据name升序](#2.1 根据name升序)
    • [2.2 根据name升序,score降序](#2.2 根据name升序,score降序)
  • [3. 使用Collections排序](#3. 使用Collections排序)
    • [3.1 根据name升序](#3.1 根据name升序)
    • [3.2 根据name升序,score降序](#3.2 根据name升序,score降序)
  • [4. 完整的demo](#4. 完整的demo)

JDK8对List对象根据属性排序

1. 被排序字段为null或者空时候报错

被排序字段为null或者空的时候报java.lang.NullPointerException

shell 复制代码
Exception in thread "main" java.lang.NullPointerException
	at java.util.Comparator.lambda$comparing$77a9974f$1(Comparator.java:469)
	at java.util.TimSort.countRunAndMakeAscending(TimSort.java:356)
	at java.util.TimSort.sort(TimSort.java:220)
	at java.util.Arrays.sort(Arrays.java:1512)
	at java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:348)
	at java.util.stream.Sink$ChainedReference.end(Sink.java:258)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.stormkai.jh.ListSortDemo1.getNameAsc(ListSortDemo1.java:40)
	at com.stormkai.jh.ListSortDemo1.main(ListSortDemo1.java:19)

使用以下方式处理:

  • Comparator.nullsLast:排序字段为null的排在后面
  • Comparator.nullsFirst:排序字段为null的排在前面
  1. 集合工具类Collections
java 复制代码
Collections.sort(students1,Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)));
  1. stream流的方式
java 复制代码
List<Student> students1 = students.stream().map(student -> {
            if("".equals(student.getName())){
                student.setName(null);
            }
            return student;
        }).sorted(Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)))
                .collect(Collectors.toList())

2. 使用Stream流排序

Student.java

java 复制代码
@Data
@AllArgsConstructor
public class Student {
    private Integer id;
    private String name;
    private double score;
}

2.1 根据name升序

java 复制代码
public class ListSortDemo1 {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<Student>(){{
            add(new Student(1,"张三C",98.50d));
            add(new Student(2,"张三B",67.50d));
            add(new Student(3,"张三A",85.40d));
            add(new Student(4,"",79.60d));
            add(new Student(5,null,84.80d));
            add(new Student(6,"张三D",95.20d));
        }};
        List<Student> students1 = getNameAsc(students);
        students1.forEach(System.out::println);
    }

    //按name升序,null和空的name都以null处理,排在最后
    private static List<Student> getNameAsc(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if("".equals(student.getName())){
                student.setName(null);
            }
            return student;
        }).sorted(Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)))
                .collect(Collectors.toList());
        return students1;
    }
}

执行结果:

shell 复制代码
Student(id=3, name=张三A, score=85.4)
Student(id=2, name=张三B, score=67.5)
Student(id=1, name=张三C, score=98.5)
Student(id=6, name=张三D, score=95.2)
Student(id=4, name=null, score=79.6)
Student(id=5, name=null, score=84.8)

2.2 根据name升序,score降序

java 复制代码
//按name升序,按score降序,null和空的name都以null处理,排在最后
    private static List<Student> getNameAscAndScoreDesc(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if("".equals(student.getName())){
                student.setName(null);
            }
            return student;
        }).sorted(Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)).reversed().thenComparing(Student::getScore).reversed())
                .collect(Collectors.toList());
        return students1;
    }

输出结果:

shell 复制代码
Student(id=3, name=张三A, score=85.4)
Student(id=2, name=张三B, score=67.5)
Student(id=1, name=张三C, score=98.5)
Student(id=6, name=张三D, score=95.2)
Student(id=5, name=null, score=84.8)
Student(id=4, name=null, score=79.6)

3. 使用Collections排序

3.1 根据name升序

java 复制代码
public class ListSortDemo1 {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<Student>(){{
            add(new Student(1,"张三C",98.50d));
            add(new Student(2,"张三B",67.50d));
            add(new Student(3,"张三A",85.40d));
            add(new Student(4,"",79.60d));
            add(new Student(5,null,84.80d));
            add(new Student(6,"张三D",95.20d));
        }};
        //List<Student> students1 = getNameAsc(students);
        //List<Student> students1 = getNameAscAndScoreDesc(students);
        List<Student> students1 = getNameAsc1(students);
        students1.forEach(System.out::println);
    }

    private static List<Student> getNameAsc1(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if ("".equals(student.getName())) {
                student.setName(null);
            }
            return student;
        }).collect(Collectors.toList());
        Collections.sort(students1,Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)));
        return students1;
    }
}

输出结果:

shell 复制代码
Student(id=3, name=张三A, score=85.4)
Student(id=2, name=张三B, score=67.5)
Student(id=1, name=张三C, score=98.5)
Student(id=6, name=张三D, score=95.2)
Student(id=4, name=null, score=79.6)
Student(id=5, name=null, score=84.8)

3.2 根据name升序,score降序

java 复制代码
private static List<Student> getNameAscAndScoreDesc1(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if ("".equals(student.getName())) {
                student.setName(null);
            }
            return student;
        }).collect(Collectors.toList());
        Collections.sort(students1,Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)).reversed().thenComparing(Student::getScore).reversed());
        return students1;
    }

输出结果:

shell 复制代码
Student(id=3, name=张三A, score=85.4)
Student(id=2, name=张三B, score=67.5)
Student(id=1, name=张三C, score=98.5)
Student(id=6, name=张三D, score=95.2)
Student(id=5, name=null, score=84.8)
Student(id=4, name=null, score=79.6)

4. 完整的demo

java 复制代码
public class ListSortDemo1 {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<Student>(){{
            add(new Student(1,"张三C",98.50d));
            add(new Student(2,"张三B",67.50d));
            add(new Student(3,"张三A",85.40d));
            add(new Student(4,"",79.60d));
            add(new Student(5,null,84.80d));
            add(new Student(6,"张三D",95.20d));
        }};
        //List<Student> students1 = getNameAsc(students);
        //List<Student> students1 = getNameAscAndScoreDesc(students);
        //List<Student> students1 = getNameAsc1(students);
        List<Student> students1 = getNameAscAndScoreDesc(students);
        students1.forEach(System.out::println);
    }

    //按name升序,null和空的name都以null处理,排在最后
    private static List<Student> getNameAsc(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if("".equals(student.getName())){
                student.setName(null);
            }
            return student;
        }).sorted(Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)))
                .collect(Collectors.toList());
        return students1;
    }

    private static List<Student> getNameAsc1(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if ("".equals(student.getName())) {
                student.setName(null);
            }
            return student;
        }).collect(Collectors.toList());
        Collections.sort(students1,Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)));
        return students1;
    }

    //按name升序,按score降序,null和空的name都以null处理,排在最后
    private static List<Student> getNameAscAndScoreDesc(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if("".equals(student.getName())){
                student.setName(null);
            }
            return student;
        }).sorted(Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)).reversed()
                .thenComparing(Student::getScore).reversed())
                .collect(Collectors.toList());
        return students1;
    }

    private static List<Student> getNameAscAndScoreDesc1(List<Student> students) {
        List<Student> students1 = students.stream().map(student -> {
            if ("".equals(student.getName())) {
                student.setName(null);
            }
            return student;
        }).collect(Collectors.toList());
        Collections.sort(students1,Comparator.comparing(Student::getName,Comparator.nullsLast(String::compareTo)).reversed()
                .thenComparing(Student::getScore).reversed());
        return students1;
    }
}
相关推荐
阿强7727 分钟前
包装类缓存对象
java·缓存·包装类
LUCIAZZZ2 小时前
TCP基本入门-简单认识一下什么是TCP
java·网络·后端·网络协议·tcp/ip·计算机网络·spring
卜及中2 小时前
【Docker基础】理解 Registry 镜像仓库:分类、工作机制、命令与实操
java·docker·容器·eureka
_未知_开摆2 小时前
2020年蓝桥杯Java B组第二场题目+部分个人解析
java·经验分享·后端·程序人生·蓝桥杯
虾球xz2 小时前
游戏引擎学习第126天
java·学习·游戏引擎
郑祎亦3 小时前
Java 关键字 volatile
java·开发语言·jvm
不会飞的小龙人3 小时前
Quickwit获取Kafka数据源消息
java·docker·容器·kafka·quickwit
诗诗的博客3 小时前
jmeter聚合报告如何添加单位_性能测试连载(8)jmeter压力测试中的难点解析
java·开发语言
luoluoal3 小时前
java项目之基于ssm的线上旅游体验系统(源码+文档)
java·mysql·mybatis·ssm·源码
茂茂在长安4 小时前
JAVA面试_进阶部分_23种设计模式总结
java·设计模式·面试