java stream去重的几种方式

本文介绍了三种在Java中使用Stream进行去重的方法:1)使用distinct(),依赖元素的hashCode()和equals();2)结合collectingAndThen()和toCollection(),基于特定属性如name去重,但可能改变原顺序;3)利用filter()和Predicate,结合Set记录已出现元素,按需属性去重。
摘要由CSDN通过智能技术生成

使用 Stream 的 distinct() 方法

这个方法会根据元素的 hashCode() 和 equals() 方法来判断是否重复。如果是自定义的类,需要重写这两个方法。

示例:

//利用java8的stream去重
List uniqueList = list.stream()
					.distinct()
					.collect(Collectors.toList());
System.out.println(uniqueList.toString());

使用 collectingAndThen() 和 toCollection() 方法

这个方法可以根据元素的某个属性或者多个属性来去重,比如 name 或者 name+address。这个方法会使用 TreeSet 来排序元素,所以不能保持原来的顺序。

示例:

//根据name属性去重
List<User> lt = list.stream().collect(
        Collectors.collectingAndThen(
                toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))),
                ArrayList::new)
);
System.out.println("去重后的:" + lt);

使用 filter() 方法

这个方法需要自定义一个 Predicate 函数,用一个 Set 来记录已经出现过的元素,然后过滤掉重复的元素。

示例:

//定义一个Predicate函数
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

//根据age属性去重
list.stream().filter(distinctByKey(s -> s.getAge()))
        .forEach(System.out::println);

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
stream流是在处理数据时非常常见的一种方式。重复使用stream流可以带来很多好处,包括提高性能和减少资源消耗。 首先,重复使用stream流可以避免不必要的内存分配和释放开销。创建和销毁stream流对象需要一定的时间和资源。如果在处理数据时频繁地创建和销毁流对象,将会增加系统的负担。而重复使用已经创建的stream流对象,可以减少这种开销,并且提高处理数据的效率。 其次,重复使用stream流可以减少对文件或网络资源的频繁访问。在处理大型文件或网络请求时,频繁地打开和关闭流对象会增加I/O操作的开销。通过重复使用已经打开的stream流对象,可以避免这种开销,提高数据读取或写入的速度。 另外,重复使用stream流还可以简化代码逻辑。在多次读写数据的场景中,如果每次都要重新创建和配置流对象,会导致代码冗余和可读性下降。通过重复使用已经存在的stream流对象,可以简化代码,使其更加清晰和易于维护。 需要注意的是,在重复使用stream流时,要确保正确地管理流的状态和位置。例如,在读取文件时,需要在每次使用前将流的位置重置到起始位置,以便从头开始读取数据。 综上所述,重复使用stream流可以提高性能、减少资源消耗,并简化代码逻辑。在处理数据时,可以考虑使用这种方式来优化程序的效率和可维护性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值