📜  如何在Java中的 Stream 中查找重复元素(1)

📅  最后修改于: 2023-12-03 15:08:55.332000             🧑  作者: Mango

如何在Java中的 Stream 中查找重复元素

当我们处理一些集合数据时,有时需要查找其中是否存在重复元素。在Java中,我们可以使用Stream API中的distinct()方法过滤掉重复元素,但是如果我们想查找重复元素并进行相应的处理,该怎么办呢?本文将介绍如何在Java中的Stream中查找重复元素,帮助程序员更好的处理集合数据。

方法一:利用HashSet

我们可以使用HashSet来判断集合中是否存在重复元素。HashSet内部维护了一个不重复的元素集合,当我们往HashSet中加入元素时,如果该元素已经存在于HashSet中,则添加不成功,返回false。利用这个特性,我们可以在Stream中使用filter()方法过滤掉不重复的元素,剩下的就是重复的元素了。

List<String> list = Arrays.asList("A", "B", "C", "B", "D", "A");
Set<String> set = new HashSet<>();
List<String> resultList = list.stream()
        .filter(s -> !set.add(s))// 判断是否能加入到set中,不能加入即为重复元素
        .collect(Collectors.toList());
System.out.println(resultList);// [B, A]
方法二:利用Collectors.groupingBy()

我们可以使用Collectors.groupingBy()方法将Stream中的元素按照某个属性分组,然后统计每个分组中的元素个数。如果某个分组中的元素个数大于1,则说明该分组中存在重复元素。

List<String> list = Arrays.asList("A", "B", "C", "B", "D", "A");
Map<String, Long> result = list.stream()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
List<String> resultList = result.entrySet().stream()
        .filter(entry -> entry.getValue() > 1)// 过滤掉元素个数小于等于1的分组
        .map(Map.Entry::getKey)// 获取重复的元素
        .collect(Collectors.toList());
System.out.println(resultList);// [B, A]
方法三:利用Collectors.toMap()

我们可以使用Collectors.toMap()方法将Stream中的元素转化为Map,其中Map的key为元素本身,value为该元素在Stream中出现的次数。如果value大于1,则说明该元素在Stream中存在重复。

List<String> list = Arrays.asList("A", "B", "C", "B", "D", "A");
Map<String, Long> result = list.stream()
        .collect(Collectors.toMap(Function.identity(), e -> 1L, Long::sum));
List<String> resultList = result.entrySet().stream()
        .filter(entry -> entry.getValue() > 1)// 过滤掉出现次数小于等于1的元素
        .map(Map.Entry::getKey)// 获取重复的元素
        .collect(Collectors.toList());
System.out.println(resultList);// [B, A]

综上所述,本文介绍了在Java中的Stream中查找重复元素的三种方法,分别是利用HashSet、Collectors.groupingBy()以及Collectors.toMap()。这些方法在处理集合数据时非常有用,可以帮助我们快速找出重复元素,从而进行相应的处理。