Java8 Stream集合与去重

该篇博客介绍了如何在Java8中利用Stream API和Collectors对HashMap集合进行去重操作。通过示例代码展示了如何取出HashMap中特定键的值并组成新列表,以及如何在保持原有元素的情况下进行去重,最后将去重后的元素转换为新的ArrayList。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,测试数据

public class STest {
    public static void main(String[] args) {
        Map<String, String> hashMap = new HashMap<>();
        Map<String, String> hashMap1 = new HashMap<>();
        ArrayList<Map<String, String>> list = new ArrayList<>();
        hashMap.put("PersonId", "ssss");
        hashMap.put("PersonName", "dddd");
        hashMap.put("FaceId", "ffff");
        hashMap1.put("PersonId", "ssss");
        hashMap1.put("PersonName", "dddd1");
        hashMap1.put("FaceId", "ffff1");
        list.add(hashMap);
        list.add(hashMap1);

        //  取出hashmap集合中key 为 m.get("PersonId") 的元素,并组成新的 list;
        List<String> personId = list.stream().map(m ->                 
                                m.get("PersonId")).collect(Collectors.toList());
        System.out.println("personId=====>"+personId);

        // 根据hashmap集合中key 为 m.get("PersonId") 的元素进行去重,保留旧元素
        TreeSet<Map<String, String>> personId1 = 
                list.stream().collect(Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(m -> m.get("PersonId")))
        ));
        System.out.println("personId1=====>"+personId1);

        // 根据hashmap集合中key 为 m.get("PersonId") 的元素进行去重,保留旧元素,组成新的List
        ArrayList<Map<String, String>> listN = null;
        listN= list.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(m -> m.get("PersonId")))
        ),ArrayList::new));
        System.out.println("listN=====>"+listN);


    }
}

2,结果

personId=====>[ssss, ssss]
personId1=====>[{FaceId=ffff, PersonName=dddd, PersonId=ssss}]
listN=====>[{FaceId=ffff, PersonName=dddd, PersonId=ssss}]

参考:

Java8集合中的对象去重重复_上善若泪-优快云博客_集合对象去重

Java8(3)Stream类的collect方法详解 - 简书

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()` 并不一定比简单排序后检查相邻元素是否相等更高效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值