Java8 Stream 之sorted方法 排序讲解

Stream.sorted 字段排序

功能说明:以自然序或着自定义Comparator 接口排序规则来排序一个流。

功能详细说明:

1、sorted() 默认使用自然序排序, 其中的元素必须实现Comparable 接口
2、sorted(Comparator<? super T> comparator) :我们可以使用lambada 来创建一个Comparator 实例。可以按照升序或着降序来排序元素。

官网代码示例:

1.  #自然序排序一个list

2. list.stream().sorted()


4. #自然序逆序元素,使用Comparator 提供的reverseOrder() 方法

5. list.stream().sorted(Comparator.reverseOrder())


7. # 使用Comparator 来排序一个list

8. list.stream().sorted(Comparator.comparing(Student::getAge))


10. # 颠倒使用Comparator 来排序一个list的顺序,使用Comparator 提供的reverseOrder() 方法

11. list.stream().sorted(Comparator.comparing(Student::getAge).reversed())

实战:按照文件编号进行排序,并计算相关文件的最小页次和最大页次



1. @Override

2. public void pageCalculation(String archSid) {

3. // TODO Auto-generated method stub

4. Map<String, Object> paramter = new HashMap<String,Object>();

5. paramter.put("archSid", archSid);

6. List<UcasFileInfo> updates = new ArrayList<UcasFileInfo>();

7. List<UcasFileInfo> ucasFileInfos = ucasFileInfoMapper.selectAll(paramter);

8. // 数据过滤

9. if(CollectionUtils.isNotEmpty(ucasFileInfos)){

10. // Java8 排序 + 过滤

11. List<UcasFileInfo> filter = ucasFileInfos.stream().filter(item->{

12. return item.getTextNums() != null && StringUtils.isNoneEmpty(item.getArchFileNo());

13. }).sorted(new Comparator<UcasFileInfo>(){

14. @Override

15. public int compare(UcasFileInfo o1, UcasFileInfo o2) {

16. if(Integer.valueOf(o1.getArchFileNo()) > Integer.valueOf(o2.getArchFileNo())){

17. return 1;

18. } else if(Integer.valueOf(o1.getArchFileNo()) == Integer.valueOf(o2.getArchFileNo())){

19. return 0;

20. } else {

21. return -1;

22. }

23. }

24. }).collect(Collectors.toList());


26. if(CollectionUtils.isNotEmpty(filter)){

27. // 页次最大与最小值计算

28. Integer total = 0;

29. String page_size = null;

30. String max_page_size = null;

31. for(int i =0; i < filter.size(); i++){

32. UcasFileInfo ucasFileInfo = filter.get(i);


34. UcasFileInfo update = new UcasFileInfo();

35. update.setSid(ucasFileInfo.getSid());


37. if(i == 0){

38. page_size = "1";

39. total += ucasFileInfo.getTextNums();

40. max_page_size = page_size.concat("-")+(total);

41. } else {

42. page_size = String.valueOf(total + 1);

43. total += ucasFileInfo.getTextNums();

44. max_page_size = page_size.concat("-")+(total);

45. }


47. // 逻辑判断:页次最大值与最小值选择

48. Integer index = i + 1;

49. if(index >= filter.size()){

50. update.setPageNo(max_page_size);


52. } else {

53. update.setPageNo(page_size);

54. }


56. updates.add(update);

57. }


59. // 执行批量更新

60. ucasFileInfoMapper.batchUpdate(updates);

61. }

62. }


64. }



Stream.sorted 多字段排序

通过Comparator.thenComparing(Comparator<? super T> other) 实现

功能说明:

1.先以年龄升序
2.当年龄相同时,在以零花钱升序

示例功能代码:



1. List<userInfo> userList3 = userList.stream()

2. .sorted(Comparator.comparing(userInfo::getAge).thenComparing(userInfo::getMoney))

3. .collect(Collectors.toList());



Stream.sorted 多字段排序区分降序和升序

通过Comparator.thenComparing(Comparator<? super T> other) 实现多字段排序,并且使用Comparator.reverseOrder() 实现降序和升序

功能说明:

1.先以年龄升序
2.当年龄相同时,在以零花钱降序 Comparator.reverseOrder()

示例功能代码:



1. List<userInfo> userList3 = userList.stream()

2. .sorted(Comparator.comparing(userInfo::getAge).thenComparing(userInfo::getMoney,Comparator.reverseOrder())).collect(Collectors.toList());