java8 steam去重
时间: 2025-06-05 10:24:50 浏览: 17
### Java 8 中使用 Stream API 的 `distinct` 方法去除重复元素
在 Java 8 中,可以通过 Stream API 提供的 `distinct()` 方法轻松地对集合中的元素进行去重操作。此方法基于对象的 `hashCode()` 和 `equals()` 实现来判断两个元素是否相同[^4]。
下面是一个完整的示例代码展示如何利用 `distinct()` 对列表中的字符串元素进行去重:
```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class DistinctExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "orange", "apple", "grape", "banana");
// 使用 distinct() 去除重复元素
List<String> uniqueList = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println("原始列表: " + list);
System.out.println("去重后的列表: " + uniqueList);
}
}
```
#### 输出结果:
```
原始列表: [apple, banana, orange, apple, grape, banana]
去重后的列表: [apple, banana, orange, grape]
```
在这个例子中,`list.stream().distinct()` 创建了一个只包含唯一元素的新流,并通过 `Collectors.toList()` 将其转换回一个列表[^2]。
---
当需要按照特定字段对复杂对象进行去重时,可以结合自定义比较逻辑完成。例如,假设有一个表示用户的类 `User`,我们希望根据用户名 (`name`) 字段去重,则可以这样做:
```java
import java.util.*;
import java.util.stream.Collectors;
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
public class CustomDistinctExample {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("Alice", 30),
new User("Bob", 25),
new User("Alice", 28), // 同名用户
new User("Charlie", 35)
);
// 根据名称字段去重
List<User> uniqueUsers = users.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing),
map -> new ArrayList<>(map.values())
));
System.out.println("原始用户列表: " + users);
System.out.println("按姓名去重后的用户列表: " + uniqueUsers);
}
}
```
#### 输出结果:
```
原始用户列表: [User{name='Alice', age=30}, User{name='Bob', age=25}, User{name='Alice', age=28}, User{name='Charlie', age=35}]
按姓名去重后的用户列表: [User{name='Alice', age=30}, User{name='Bob', age=25}, User{name='Charlie', age=35}]
```
在此案例中,`toMap` 结合了键冲突解决策略 `(existing, replacement) -> existing` 来保留首次遇到的对象实例[^1]。
---
### 注意事项
- 如果要对自定义对象进行去重,需确保实现了正确的 `hashCode()` 和 `equals()` 方法。
- 当数据量较大时,应考虑性能影响;对于有序流,`distinct()` 可能带来较高的内存消耗[^4]。
阅读全文
相关推荐


















