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重复报错
如果本篇文章对你有帮助的话,很高兴能够帮助上你。
当然,如果你觉得文章有什么让你觉得不合理、或者有更简单的实现方法又或者有理解不来的地方,希望你在看到之后能够在评论里指出来,我会在看到之后尽快的回复你。