在日常的Java开发中,我们经常会遇到需要从集合中去除重复数据的场景。传统的做法可能需要嵌套循环或借助Set等集合类型手动处理,代码冗长且效率不高。自Java 8引入Stream API后,去重操作变得异常简洁高效。本文将手把手教你如何使用Java去重流(Stream distinct)轻松实现集合去重,即使是编程小白也能快速上手!
Java 8中的Stream提供了一个名为distinct()的方法,用于过滤掉流中重复的元素。它基于元素的equals()和hashCode()方法进行判断,因此要求流中的对象正确实现了这两个方法。
我们先来看一个最简单的例子:对字符串列表去重。
import java.util.*;import java.util.stream.Collectors;public class StreamDistinctExample { public static void main(String[] args) { List<String> fruits = Arrays.asList( "apple", "banana", "apple", "orange", "banana" ); List<String> uniqueFruits = fruits.stream() .distinct() .collect(Collectors.toList()); System.out.println(uniqueFruits); // 输出: [apple, banana, orange] }} 上面的代码展示了如何使用distinct()方法配合collect()将去重后的结果收集为新的List。这是最常见的Java集合去重方式之一。
当我们处理的是自定义类(如User、Product等)时,必须确保该类正确重写了equals()和hashCode()方法,否则distinct()无法正常工作。
class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}// 使用示例List<Person> people = Arrays.asList( new Person("Alice", 25), new Person("Bob", 30), new Person("Alice", 25));List<Person> uniquePeople = people.stream() .distinct() .collect(Collectors.toList());System.out.println(uniquePeople);// 输出: [Person{name='Alice', age=25}, Person{name='Bob', age=30}] 有时我们只想根据对象的某个字段(如ID)去重,而不是整个对象。这时可以结合Collectors.toMap()或使用第三方工具(如Google Guava),但更优雅的方式是利用Stream配合一个辅助Set来实现:
import java.util.concurrent.ConcurrentHashMap;List<Person> uniqueByName = people.stream() .filter(new ConcurrentHashMap<String, Boolean>()::putIfAbsent) .collect(Collectors.toList());// 或者更清晰地写成:Set<String> seen = ConcurrentHashMap.newKeySet();List<Person> result = people.stream() .filter(p -> seen.add(p.getName())) .collect(Collectors.toList()); 这种方式利用了Set的add()方法返回值(是否成功添加)来实现按字段去重,是Java Stream distinct的灵活应用。
equals()和hashCode();distinct()是有状态操作,会保留元素首次出现的顺序;distinct()内部使用HashSet缓存已见元素,空间复杂度为O(n);anyMatch()配合Set提前终止。通过本文,你已经掌握了如何使用Java去重流(Stream distinct)高效地去除集合中的重复元素。无论是基础类型、字符串还是自定义对象,Stream API都提供了简洁而强大的解决方案。记住关键点:正确实现equals和hashCode,并根据实际需求选择合适的去重策略。
现在就打开你的IDE,尝试用Stream去重优化你的代码吧!如果你觉得这篇教程对你有帮助,欢迎分享给更多正在学习Java集合去重的小伙伴。
本文由主机测评网于2025-12-08发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124883.html