Java8排序 Stream的sorted方法

x33g5p2x  于2022-06-08 转载在 Java  
字(2.8k)|赞(0)|评价(0)|浏览(763)

Java 8 Stream之sorted()排序示例:使用java 8 的流式sorted排序List集合

Stream.sorted 字段排序

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

功能详细说明:

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

官网代码示例:

  1. #自然序排序一个list
  2. list.stream().sorted()
  3. #自然序逆序元素,使用Comparator 提供的reverseOrder() 方法
  4. list.stream().sorted(Comparator.reverseOrder())
  5. # 使用Comparator 来排序一个list
  6. list.stream().sorted(Comparator.comparing(Student::getAge))
  7. # 颠倒使用Comparator 来排序一个list的顺序,使用Comparator 提供的reverseOrder() 方法
  8. 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());
  25. if(CollectionUtils.isNotEmpty(filter)){
  26. // 页次最大与最小值计算
  27. Integer total = 0;
  28. String page_size = null;
  29. String max_page_size = null;
  30. for(int i =0; i < filter.size(); i++){
  31. UcasFileInfo ucasFileInfo = filter.get(i);
  32. UcasFileInfo update = new UcasFileInfo();
  33. update.setSid(ucasFileInfo.getSid());
  34. if(i == 0){
  35. page_size = "1";
  36. total += ucasFileInfo.getTextNums();
  37. max_page_size = page_size.concat("-")+(total);
  38. } else {
  39. page_size = String.valueOf(total + 1);
  40. total += ucasFileInfo.getTextNums();
  41. max_page_size = page_size.concat("-")+(total);
  42. }
  43. // 逻辑判断:页次最大值与最小值选择
  44. Integer index = i + 1;
  45. if(index >= filter.size()){
  46. update.setPageNo(max_page_size);
  47. } else {
  48. update.setPageNo(page_size);
  49. }
  50. updates.add(update);
  51. }
  52. // 执行批量更新
  53. ucasFileInfoMapper.batchUpdate(updates);
  54. }
  55. }
  56. }

Stream.sorted 多字段排序

通过Comparator.thenComparing(Comparator 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 other) 实现多字段排序,并且使用Comparator.reverseOrder() 实现降序和升序

功能说明:

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

示例功能代码:

  1. List<userInfo> userList3 = userList.stream()
  2. .sorted(Comparator.comparing(userInfo::getAge)
  3. .thenComparing(userInfo::getMoney,Comparator.reverseOrder())).collect(Collectors.toList());

相关文章

最新文章

更多