使⽤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);
sortedlist// 1. 只对⼀个属性进⾏排序(数⼦)将数组变成Stream 流 -> 调⽤ sorted ⽅法 -> ⽅法内传⼊对⽐规则,⽤容器对象的属性作为⼊参作为排序依据,默认升序,需要倒叙的话后⾯调⽤.reversed() ⽅法
List<Person> collect1 = personList.stream().sorted(Comparatorparing(Person::getAge)).List());
//List<Person> collect1 = personList.stream().sorted(Comparatorparing(Person::getAge).reversed
()).List());
collect1.forEach(System.out::println);
// 2. 只对⼀个属性进⾏排序(数字)该属性有为 null 的情况会报错 Exception in thread "main" java.lang.NullPointerException
// 解决办法时在 Comparatorparing()⼊参多加⼀个nullsLast()的⽅法,⽤例出来null的情况,也可以时 nullsFirst 表⽰为空的排到前⾯
Person p4 = new Person();
p4.setName("ezha");
personList.add(p4);
List<Person> collect2 = personList.stream().sorted(Comparatorparing(Person::getAge,Comparator.nullsLast(Integer::compareTo))).List());
//List<Person> collect2 = personList.stream().sorted(Comparatorparing(Person::getAge,Comparator.nullsFirst(Integer::compareTo))).List());
collect2.forEach(System.out::println);
// 3. 对多个属性进⾏排序,在⽐较后⾯加上 thenComparing ⽅法
List<Person> collect3 = personList.stream().sorted(Comparatorparing(Person::getAge,Comparator.nullsLast(Integer::compareTo)).thenComparing(Person::getName)).List());
collect3.forEach(System.out::println);
// 4. 对多个属性进⾏排序并忽略 null 值的属性,写法和前⾯的逻辑⼀样,看代码
List<Person> collect4 = personList.stream().sorted(Comparatorparing(Person::getAge,Comparator.nullsLast(Integer::compareTo)).thenComparing(Person::getName,Comparator.nullsLast(String::compareTo))).List() collect4.forEach(System.out::println);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论