Java通过Stream对象集合去重方式

@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
    
    private int id;
    
    private String name;
    
    private String password;
    
    private long classId;
}

默认去重(不起作用)

  public static void main(String[] args) {
        List<User> list = Arrays.asList(new User(3, "a", "a1", 2), new User(2, "b", "b1", 2), new User(1, "c", "c1", 3), new User(2, "b", "b1", 1),
                new User(2, "c", "c2", 4));
        method1(list);
    }
    
    //默认去重(不起作用)
    public static void method1(List<User> list) {
    
        list.stream().distinct().forEach(System.out::println);
    }

 单属性去重

   //指定单属性去重
    public static void method2(List<User> list) {
       list.stream()
                .collect(Collectors.toMap(
                        User::getName, // Key is the name property
                        item -> item, // Value is the person object itself
                        (existing, replacement) -> existing // In case of duplicate keys, keep the existing value
                ))
                .values()
                .stream()
                .toList().forEach(System.out::println);;
        
    }

双属性去重(名称+密码)

 list.stream()
                .collect(Collectors.toMap(
                        item->item.getName()+item.getPassword(), // Key is the name property
                        item -> item, // Value is the person object itself
                        (existing, replacement) -> existing // In case of duplicate keys, keep the existing value
                ))
                .values()
                .stream()
                .toList().forEach(System.out::println);

以此类推,如果是三个属性去重,只需要把key变为三个属性的拼接字符。

自定义去重方法

   public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
 list.stream().filter(User.distinctByKey(user -> user.getName()+user.getPassword()))
                .forEach(System.out::println);

Java Stream API 提供了一种强大的方法来操作集合数据,其中包括了`distinct()`方法用于集合中的复元素。这个方法能够确保结果集中的每个元素都是唯一的。 ### Java Stream集合步骤: #### 示例代码: 假设我们有一个包含整数列表的集合 `list`: ```java List<Integer> list = Arrays.asList(1, 2, 2, 3, 4, 4, 5); ``` 我们可以使用 Stream API 的 `distinct()` 方法来进行: ```java Stream<Integer> distinctStream = list.stream().distinct(); List<Integer> uniqueList = distinctStream.collect(Collectors.toList()); ``` 在这个例子中: 1. `.stream()` 将原始列表转换为 Stream 对象。 2. `.distinct()` 方法用于移除复的元素,确保只有唯一值出现在结果集中。 3. `.collect(Collectors.toList())` 将流转换回列表形式。 ### 使用 `distinct()` 方法的详细说明: `distinct()` 方法是一个最终操作,这意味着它会立即执行并生成结果,而不是像其他一些操作那样在流上缓存数据以便后续操作复用。因此,在使用 `.distinct()` 后紧接着的操作通常需要将结果收集到一个新的集合中,如上述示例中的 `.collect(Collectors.toList())`。 ### 相关问题: 1. **如何验证后的集合确实不含复项?** 可以通过遍历后的集合,并检查其大小是否等于原始集合前的唯一元素的数量,或者直接比较两个集合的元素,看它们是否完全一致。 2. **在哪些场景下可以高效地使用`distinct()`方法?** 当处理大型数据集并且需要确保结果集的唯一性时,`distinct()` 方法非常有用。特别是当集合中的元素过多,手动检查和删除复项变得繁琐和低效的时候。 3. **是否存在性能考量时需要避免使用`distinct()`方法的情况?** 虽然 `distinct()` 方法在大多数情况下效率很高,但在处理大量数据或者对性能有极高要求的应用中,考虑到其内部实现涉及额外的比较和状态维护,对于性能敏感的场合,可能会考虑使用其他的策略,比如哈希表、位向量等非流式方法。此外,如果复元素的数量极少,频繁调用 `distinct()` 并不一定比简单排序后检查相邻元素是否相等更高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值