Java8 Stream 之sorted方法 排序讲解解析

阿里 阅读:887 2021-03-31 12:53:17 评论:0

本文主要讲解:Java 8 Stream之sorted()排序示例:使用java 8 的流式sorted排序List集合

Stream.sorted 字段排序

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

功能详细说明:

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

官网代码示例:

#自然序排序一个list 
list.stream().sorted()  
 
#自然序逆序元素,使用Comparator 提供的reverseOrder() 方法 
list.stream().sorted(Comparator.reverseOrder())  
 
# 使用Comparator 来排序一个list 
list.stream().sorted(Comparator.comparing(Student::getAge))  
 
# 颠倒使用Comparator 来排序一个list的顺序,使用Comparator 提供的reverseOrder() 方法 
list.stream().sorted(Comparator.comparing(Student::getAge).reversed()) 

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

@Override 
	public void pageCalculation(String archSid) { 
		// TODO Auto-generated method stub 
		Map<String, Object> paramter = new HashMap<String,Object>(); 
		paramter.put("archSid", archSid); 
		List<UcasFileInfo> updates = new ArrayList<UcasFileInfo>(); 
		List<UcasFileInfo> ucasFileInfos = ucasFileInfoMapper.selectAll(paramter); 
		// 数据过滤 
		if(CollectionUtils.isNotEmpty(ucasFileInfos)){ 
			// Java8 排序 + 过滤 
			List<UcasFileInfo> filter = ucasFileInfos.stream().filter(item->{ 
				return item.getTextNums() != null && StringUtils.isNoneEmpty(item.getArchFileNo()); 
			}).sorted(new Comparator<UcasFileInfo>(){ 
				@Override 
				public int compare(UcasFileInfo o1, UcasFileInfo o2) { 
					if(Integer.valueOf(o1.getArchFileNo()) > Integer.valueOf(o2.getArchFileNo())){ 
						return 1; 
					} else if(Integer.valueOf(o1.getArchFileNo()) == Integer.valueOf(o2.getArchFileNo())){ 
						return 0; 
					} else { 
						return -1; 
					} 
				} 
			}).collect(Collectors.toList()); 
			 
			if(CollectionUtils.isNotEmpty(filter)){ 
				// 页次最大与最小值计算 
				Integer total = 0; 
				String page_size = null; 
				String max_page_size = null; 
				for(int i =0; i < filter.size(); i++){ 
					UcasFileInfo ucasFileInfo = filter.get(i); 
					 
					UcasFileInfo update = new UcasFileInfo(); 
					update.setSid(ucasFileInfo.getSid()); 
					 
					if(i == 0){ 
						page_size = "1"; 
						total += ucasFileInfo.getTextNums(); 
						max_page_size = page_size.concat("-")+(total); 
					} else { 
						page_size = String.valueOf(total + 1); 
						total += ucasFileInfo.getTextNums(); 
						max_page_size = page_size.concat("-")+(total); 
					} 
					 
					// 逻辑判断:页次最大值与最小值选择 
					Integer index = i + 1; 
					if(index >= filter.size()){ 
						update.setPageNo(max_page_size); 
						 
					} else { 
						update.setPageNo(page_size); 
					} 
					 
					updates.add(update); 
				} 
				 
				// 执行批量更新 
				ucasFileInfoMapper.batchUpdate(updates); 
			} 
		} 
 
	}

Stream.sorted 多字段排序

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

功能说明:

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

示例功能代码:

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

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

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

功能说明:

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

示例功能代码:

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

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

全民解析

全民解析

关注我们