Java如何对Stream流进行排序呢?
下文笔者讲述使用stream对集合进行"升序或降序"的方法及示例分享
Stream排序的实现思路
Stream排序可使用sorted方法 单个属性排序格式: 升序: list.stream().sorted(Comparator.comparing(实体::get属性)).collect(Collectors.toList()); 例: personnelList.stream().sorted(Comparator.comparing(Personnel::getId)).collect(Collectors.toList()); 降序: list.stream().sorted(Comparator.comparing(实体::get属性).reversed()).collect(Collectors.toList()); personnelList.stream().sorted(Comparator.comparing(Personnel::getId).reversed()).collect(Collectors.toList()); 多个属性排序格式: 只需在比较后面加上 thenComparing 方法 集合.stream().sorted(Comparator.comparing(实体::get属性).thenComparing(实体::get属性)).collect(Collectors.toList());, 例: personnels.stream().sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo)) .thenComparing(Personnel::getEmail)) .collect(Collectors.toList()); 注意事项: 只对属性进行排序(此属性是封装类)该属性有为 null 的情况会报错 此时需要 在Comparator.comparing()入参多加一个nullsLast()的方法 例: 对单个排序 personnelList.stream() .sorted(Comparator.comparing(Personnel::getId, Comparator.nullsLast(Integer::compareTo))) .collect(Collectors.toList()); 例 对多个排序: personnels.stream().sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo)) .thenComparing(Personnel::getEmail,Comparator.nullsLast(String::compareTo))) .collect(Collectors.toList());例
实体类
import lombok.Data;
@Data
public class Personnel {
private Integer id;
private String name;
private String email;
public Personnel() {
}
public Personnel(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
}
测试类
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class StreamSortDemo {
@Test
public void testDemo() {
//模拟数据
Personnel personnel1 = new Personnel(1, "张三", "zhangsan@zhangsan");
Personnel personnel2 = new Personnel(3, "李四", "lisi@lisi");
Personnel personnel3 = new Personnel(2, "王五", "wangwu@wangwu");
//构造集合
ArrayList<Personnel> personnelList = new ArrayList<>();
personnelList.add(personnel1);
personnelList.add(personnel2);
personnelList.add(personnel3);
//看一下原始集合--id分别为 1 3 2
System.out.println("排序前:");
personnelList.forEach(System.out::println);
//1.正序输出, id 分别为 1 2 3
List<Personnel> positiveList = personnelList.stream()
.sorted(Comparator.comparing(Personnel::getId)).collect(Collectors.toList());
System.out.println("升序排序后:");
positiveList.forEach(System.out::println);
//2. 倒序输出, id分别为 3 2 1
List<Personnel> reversedList = personnelList.stream().sorted(Comparator.comparing(Personnel::getId).reversed())
.collect(Collectors.toList());
System.out.println("倒序排序后:");
reversedList.forEach(System.out::println);
//有null的情况
// 只对一个属性进行排序(数字)该属性有为 null 的情况会报错 java.lang.UnsupportedOperationException
// --对封装类Integer报错 对如果是基本数据类型int则不报错
Personnel personnel4 = new Personnel();
personnel4.setName("岳腾");
personnelList.add(personnel4);
//报错代码:
//personnelList.stream()
.sorted(Comparator.comparing(Personnel::getId))
.collect(Collectors.toList());
//解决:
List<Personnel> aboutNullList = personnelList.stream()
.sorted(Comparator.comparing(Personnel::getId, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.toList());
System.out.println("有空值时,进行升序排序");
aboutNullList.forEach(System.out::println);
//利用多个属性进行排序,在比较后面加上thenComparing-
List<Personnel> multiplePropertiesList = personnelList.stream()
.sorted(Comparator.comparing(Personnel::getName).thenComparing(Personnel::getEmail))
.collect(Collectors.toList());
System.out.println("多个值进行排序进行排序:");
multiplePropertiesList.forEach(System.out::println);
Personnel personnel5 = new Personnel();
personnel4.setId(5);
personnelList.add(personnel5);
//此时再去使用多个值,这多个值都为null的话,则会报错---->
/*
personnelList.stream()
.sorted(Comparator.comparing(Personnel::getName).thenComparing(Personnel::getEmail))
.collect(Collectors.toList());
*/
// 解决方案:
//对多个属性进行排序,在比较后面加上thenComparing,并忽略null值得属性。
List<Personnel> multiplePropertiesAboutNullList = personnelList.stream()
.sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo)).thenComparing(Personnel::getEmail, Comparator.nullsLast(String::compareTo)))
.collect(Collectors.toList());
System.out.println("有空值时,多个值进行排序进行排序:");
multiplePropertiesAboutNullList.forEach(System.out::println);
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


