Java 1.8 List集合排序、去重、分组、过滤、合并、截取操作

本文介绍了JavaStreamAPI中的一些核心操作,包括使用Comparator进行正序和逆序排序,处理空值的情况,以及去重方法如distinct和根据属性去重。此外,还讲解了分组操作如单条件和多条件分组,过滤特定元素,以及如何合并集合中的属性。最后提到了集合的截取方法,确保安全地获取前n个元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、排序

1、正序


List<UserVO> newvos = vos.stream().sorted(Comparator.comparing(UserVO::getTime)).collect(Collectors.toList());

2、逆序


List<UserVO> newvos = vos.stream().sorted(Comparator.comparing(UserVO::getTime).reversed()).collect(Collectors.toList());

3、根据某个属性或多个属性排序
多个属性排序:需要添加排序条件就在后面添加.thenComparing(UserVO::getxxx),它是在上一个条件的基础上进行排序


List<UserVO> list10 = listTemp.stream().sorted(Comparator.comparing(UserVO::getNum)
                    .thenComparing(UserVO::getName);
                    

注意:如果排序的字段为空,以上方法会出现空指针异常!
解决方法:

List<UserVO> newvos = vos.stream().sorted(Comparator.comparing(UserVO::getTime,Comparator.nullsFirst(String::compareTo))).collect(Collectors.toList());

Comparator.nullsFirst(根据getTime类型改变::compareTo)

Comparator.nullsFirst 表示将排序字段中的 null 值放到集合最前面
Comparator.nullsLast 表示将排序字段中的 null 值放到集合最后面

二、去重

1、去重


List<UserVO> newvos = vos.stream().distinct().collect(Collectors.toList());

2、根据某个属性去重(它将该字段还进行排序了)


List<UserVO> newvos = vos.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->new TreeSet<>(Comparator.comparing(UserVO::getId))), ArrayList::new));

3、根据某个属性去重(这个方法没有排序)

import java.util.function.Function;
import java.util.function.Predicate;

List<UserVO> newvos= result.stream().filter(distinctByKey(o -> o.getId())).collect(Collectors.toList());


public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
     Map<Object, Boolean> map = new HashMap<>();
     return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

4、对多个对象去重(它将该字段还进行排序了)


List<UserVO> newvos = list.stream().collect( Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o->o.getID()+ ";" + o.getName()))),ArrayList::new)); 

三、分组

1、单条件分组


Map<String, List<UserVO>> groupedMap = result.stream().collect(Collectors.groupingBy(dto -> dto.getId()));
// 提取分组后的列表
List<List<UserVO>> resultLists = new ArrayList<>(groupedMap.values());
for (List<UserVO> resultList : resultLists) {
	//方法体
}

2、多条件分组

在groupingBy里面添加分组条件(dto -> dto.getId() +“|” +dto.getName())

四、过滤

1、在集合中查询用户名user为lkm的集合


List<UserVO> newvos = vos.stream().filter(o ->"lkm".equals(o.getName())).collect(Collectors.toList());

2、在集合中不要用户名user为lkm的集合(true是要,false是不要)

		List<UserVO> newVos = vos.stream().filter(o ->{
			if("lkm".equals(o.getName())){
				return false;
			}else{
				return true;
			}
		}).collect(Collectors.toList());

五、合并

1、合并集合某个属性


List<UserVO> newvos = list.stream().collect(Collectors.toMap(BillsNums::getId, a -> a, (o1,o2)-> {
				o1.setNums(o1.getNums() + o2.getNums());
				o1.setSums(o1.getSums() + o2.getSums());
				return o1;
			})).values().stream().collect(Collectors.toList());
			

六、截取

集合截取有两种方法,分别是list.subList(0, n)和Stream处理,前者集合如果不足n条,会出现异常错误,而后者截取前n条数据,哪怕集合不足n条数据也不会报错。

List<String> sublist = list.stream().limit(n).collect(Collectors.toList());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻猴儿

小编,多谢客官留下的赏钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值