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());
|