java list根据对象属性去重
时间: 2025-06-29 11:22:33 浏览: 6
### Java 中基于对象属性去除列表重复项
在 Java 中,可以通过多种方法来根据对象的特定属性移除 `List` 中的重复项。以下是几种常见的解决方案:
#### 方法一:使用 Stream API 和 Collectors.toMap()
利用 Java 8 的流式处理特性,可以方便地完成这一操作。此方法适用于需要保留最新或最旧记录的情形。
```java
import java.util.*;
import java.util.stream.Collectors;
class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{id='" + id + "', name='" + name + "'}";
}
// Getters and setters...
}
public class Main {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("1", "Alice"),
new User("2", "Bob"),
new User("1", "Charlie") // Duplicate ID with different names.
);
Map<String, User> uniqueUsersById = users.stream()
.collect(Collectors.toMap(User::getId, user -> user,
(existing, replacement) -> existing)); // Keep the first occurrence.
List<User> result = new ArrayList<>(uniqueUsersById.values());
System.out.println(result);
}
}
```
这种方法通过 `Collectors.toMap()` 将具有相同键的对象合并到一起,并可以选择保留第一个遇到的对象还是最后一个[^2]。
#### 方法二:使用 LinkedHashSet 实现有序去重
如果希望保持原始顺序不变,则可采用如下方案:
```java
import java.util.*;
class Product {
private int productId;
private String productName;
public Product(int productId, String productName) {
this.productId = productId;
this.productName = productName;
}
public int getProductId() {return productId;}
@Override
public boolean equals(Object o) {...} // Implement equality check by product Id
@Override
public int hashCode() {...} // Ensure consistent hash code generation based on product Id
@Override
public String toString() {
return "Product{" +
"productId=" + productId +
", productName='" + productName + '\'' +
'}';
}
}
public class Main {
public static void main(String[] args) {
List<Product> products = Arrays.asList(
new Product(101, "Laptop"),
new Product(102, "Mouse"),
new Product(101, "Keyboard") // Duplicate ID but different name.
);
Set<Integer> seenIds = new HashSet<>();
List<Product> distinctProducts = new LinkedList<>();
for (Product p : products) {
if (!seenIds.contains(p.getProductId())) {
distinctProducts.add(p);
seenIds.add(p.getProductId());
}
}
System.out.println(distinctProducts);
}
}
```
这里创建了一个辅助集合用于跟踪已经见过的产品ID,从而确保只添加唯一实例至最终的结果集中[^3]。
这两种方式都能有效地解决基于对象某个字段值来进行去重的需求。对于更复杂的应用场景,还可以考虑自定义比较器或其他高级数据结构来满足具体业务逻辑的要求。
阅读全文
相关推荐

















