List对象列表中stream通过多个字段去重生成新列表,求和,排序

List对象列表中通过stream多个字段去重生成新列表。


话不多说,直接上代码,多种方式实现列表中多字段去重,如下:

方式一:


// 列表对象中,多个字段校验,去重后生成新的列表
List<TbProjectCostLmm> testList = list.stream().collect(
        Collectors.collectingAndThen(Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(
                        o -> o.getTenantId() + ";" + o.getCostVersionId() + ";"
                                + o.getProjectId() + ";" + o.getLmmId())
                )), ArrayList::new));

方式二:


// 通过多个字段分组,并生成Map:key(字段组合),value(对象列表)
Map<Object, List<TbProjectCollect>> costLmmMap = clList.parallelStream()
        .collect(Collectors.groupingBy(item -> (item.getProjectId() +
        "_" + item.getLmmId()), Collectors.toList()));

方式三:


// 通过Map生成键值对,Key去重
Map<Long,String> newMap = newList.stream().collect(Collectors
        .toMap(TbCostVO::getId, TbCostVO::getCode));

其他常用操作,求和:

java8的stream是一个非常强大的功能,今天遇到List<Object>求和,如果Object是个对象,你可以这么写👇:

int sum = list.stream().mapToLong(User::getAge).sum();

如果你是List<int>,你可以这么写👇:

int sum = list.stream().reduce(Integer::sum).orElse(0);

但如果你是List<Object>,而object又是Integer,你可以这样👇:

Integer o = inventorys.stream().map(String::valueOf).map(Integer::valueOf).reduce(Integer::sum).orElse(0);

解释下最后一行再干嘛:

第一个.map(String::valueOf)是将object转换为string,第二个.map(Integer::valueOf)是将string转为integer,.reduce(Integer::sum)这个是求和;


// 排序:
//方法1:先对年龄进行升序,结果进行 反转
userList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed())
.collect(Collectors.toList());
//方法2:直接对年龄进行 降序
userList = userList.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder()))
.collect(Collectors.toList());
userList.forEach(System.out::println);

//根据 多个字段排序
userList = userList.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getClassNo))
.collect(Collectors.toList());
//方法1:先对年龄进行升序,升序结果进行反转,再进行班级升序
userList = userList.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getClassNo))
.collect(Collectors.toList());
//方法2:直接对年龄进行降序,再对班级进行升序
userList = userList.stream().sorted(Comparator.comparing(User::getAge, Comparator.reverseOrder()).thenComparing(User::getClassNo))
.collect(Collectors.toList());
//方式3:先对年龄进行升序,再对班级进行升序,最后对结果进行反转
userList = userList.stream().sorted(Comparator.comparing(User::getAge).thenComparing(User::getClassNo).reversed())
.collect(Collectors.toList());
 


Map<Long, Entity> entityMap= entityList.stream()
.collect(Collectors.toMap(Entity::getType, Function.identity(),
(entity1,entity2) -> entity1));  // 防止Key重复报错

如果本篇文章对你有帮助的话,很高兴能够帮助上你。

当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值