控制台 退出登录

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

本文采用 CC BY-NC-SA 4.0 协议发布

相关文章

None

None

None

None

SpringCloud(9)

SpringCloud(9)

SpringCloud(8)