zoukankan      html  css  js  c++  java
  • 使用 Stream 流对集合排序,包含对空属性的处理

    在业务中有可能要对数据库查询出来的数据进行过滤,这样数据库的排序功能就不能用了,得手写了,Java 8 的 Stream 流提供了很好的排序方法。

    假如我们要对 Person 类数组进行排序

    @Data
    public class Person {
        private String name;
        private Integer age;
        private Integer rank;
        public Person() {}
        public Person(String name, Integer age, Integer rank) {
            this.name = name;
            this.age = age;
            this.rank = rank;
        }
    }
    

    创建 Person 对象并添加到 List 集合中

    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public class OrderStreamTest {
        public static void main(String[] args) {
            Person p1 = new Person("zhang",60,1);
            Person p2 = new Person("li",11,2);
            Person p3 = new Person("w",13,3);
    
            List<Person> personList = new ArrayList<>();
            personList.add(p1);
            personList.add(p2);
            personList.add(p3);
    
            // 1. 只对一个属性进行排序(数子)将数组变成Stream 流 -> 调用 sorted 方法 -> 方法内传入对比规则,用容器对象的属性作为入参作为排序依据,默认升序,需要倒叙的话后面调用.reversed() 方法
            List<Person> collect1 = personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
            //List<Person> collect1 = personList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());
            collect1.forEach(System.out::println);
            // 2. 只对一个属性进行排序(数字)该属性有为 null 的情况会报错  Exception in thread "main" java.lang.NullPointerException
            // 解决办法时在 Comparator.comparing()入参多加一个nullsLast()的方法,用例出来null的情况,也可以时 nullsFirst 表示为空的排到前面
            Person p4 = new Person();
            p4.setName("ezha");
            personList.add(p4);
            List<Person> collect2 = personList.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsLast(Integer::compareTo))).collect(Collectors.toList());
            //List<Person> collect2 = personList.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsFirst(Integer::compareTo))).collect(Collectors.toList());
            collect2.forEach(System.out::println);
            // 3. 对多个属性进行排序,在比较后面加上 thenComparing 方法
            List<Person> collect3 = personList.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsLast(Integer::compareTo)).thenComparing(Person::getName)).collect(Collectors.toList());
            collect3.forEach(System.out::println);
            // 4. 对多个属性进行排序并忽略 null 值的属性,写法和前面的逻辑一样,看代码
            List<Person> collect4 = personList.stream().sorted(Comparator.comparing(Person::getAge,Comparator.nullsLast(Integer::compareTo)).thenComparing(Person::getName,Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
            collect4.forEach(System.out::println);
        }
    }
    
  • 相关阅读:
    vue开发中v-for在Eslint的规则检查下出现:Elements in iteration expect to have 'v-bind:key' directives
    一步步构造自己的vue2.0+webpack环境
    函数的扩展
    数值的扩展
    DB2数据库代码页和实例代码页的区别(解决DB2乱码问题)
    【翻译】探究Ext JS 5和Sencha Touch的布局系统
    【翻译】培训提示:解决常见编码问题的简单技巧
    【翻译】对于Ext JS 5,你准备好了吗?
    Git工程迁移方法总结(命令行)
    Ext JS 5初探(三)
  • 原文地址:https://www.cnblogs.com/vawa/p/14010796.html
Copyright © 2011-2022 走看看