【Java】【Collectors】Collectors.collectingAndThen 去重

Collectors.collectingAndThen

  • Adapts a Collector to perform an additional finishing transformation
  • 对结果集收集的结果再用function函数进行处理,第一个参数是Collector,可以使用Collectors里面的各种工具类
public static <T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)

应用:根据list中对象某属性进行去重

List<Student> studentList = new ArrayList<>();
studentList.add(new Student("111", 132774, 12, "1"));
studentList.add(new Student("123", 13556, 15, "1"));
studentList.add(new Student("1146", 13165142, 16, "1"));
studentList.add(new Student("111", 136542, 14, "2"));
studentList.add(new Student("141321", 5641542, 15, "2"));
studentList.add(new Student("1454135", 2222542, 15, "2"));

List<Student> collect = studentList.stream().collect(
		Collectors.collectingAndThen(
		        Collectors.toCollection( 
		                () -> new TreeSet<>(Comparator.comparing(Student::getStuName))),
		        ArrayList::new));

System.out.println(collect.size());

// 等效处理   此处在treeSet构造方法中传入比较器 可以自定义比较器传入
TreeSet<Student> treeSet = new TreeSet<>(Comparator.comparing(Student::getStuName));
treeSet.addAll(studentList);
List<Student> treeCollect = new ArrayList<>(treeSet);

System.out.println(treeCollect.size());

output

Student{stuName='111', stuId=132774, stuAge=12, classNum='1'}
Student{stuName='1146', stuId=13165142, stuAge=16, classNum='1'}
Student{stuName='123', stuId=13556, stuAge=15, classNum='1'}
Student{stuName='141321', stuId=5641542, stuAge=15, classNum='2'}
Student{stuName='1454135', stuId=2222542, stuAge=15, classNum='2'}
  • 第一种方法的finisher调用的是ArrayList(Collection<? extends E> c),所以就是把Collector<T,A,R> downstream的结果再给到Function<R,RR> finisher去处理,用toCollection收集结果
  • 第二种用treeSet就是用比较器来进行排序去重,如果compareTo返回0,说明是重复的,返回的是自己的某个属性和另一个对象的某个属性的差值,如果是负数,则往前面排,如果是正数,往后面排。在set放元素时,是一个循环比较的过程,一旦有一个相等,就不再比较。
  • ComparTo()方法是一个比较方法,比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。默认为零系统认为都是同一个对象,所以只存入一个,因为Set集合的无序、唯一性
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值