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

时间:2025-04-04 15:32:08

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


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

方式一:


// 列表对象中,多个字段校验,去重后生成新的列表
List<TbProjectCostLmm> testList = ().collect(
        ((
                () -> new TreeSet<>((
                        o -> () + ";" + () + ";"
                                + () + ";" + ())
                )), ArrayList::new));

方式二:


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

方式三:


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

其他常用操作,求和:

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

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

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

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

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

Integer o = ().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 = ().sorted((User::getAge).reversed())
.collect(());
//方法2:直接对年龄进行 降序
userList = ().sorted((User::getAge, ()))
.collect(());
(::println);

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


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

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

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