Java 对象集合根据其中某个字段去重
时间: 2023-07-18 16:47:34 浏览: 63
可以使用 Java 8 中的 Stream API 和 Collectors 工具类来实现对象集合根据其中某个字段去重的功能。具体代码如下:
假设有一个名为 User 的对象,其中有一个字段为 name,现在需要根据 name 字段去重 User 对象集合 userList:
```java
List<User> distinctUsers = userList.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))),
ArrayList::new
)
);
```
上述代码的核心是使用 TreeSet 来去重,然后再将其转换为 ArrayList。其中,Comparator.comparing(User::getName) 表示按照 User 对象的 name 字段进行比较。
需要注意的是,如果 User 对象中的 name 字段可能为 null,那么需要在比较器中进行特殊处理,例如:
```java
Comparator.comparing(user -> Objects.toString(user.getName(), null))
```
这里使用了 Objects.toString() 方法将 null 转换为空字符串,以防止比较器报错。
相关问题
java stream集合根据某个字段去重
在Java中,使用Stream可以很方便地对集合进行去重操作。根据引用的内容,有两种常见的方法可以实现根据某个字段去重的功能。
方法一是重写实体的equals和hashCode方法。通过重写equals方法来定义两个对象是否相等,再结合hashCode方法保证相等对象具有相同的哈希值。然后使用stream的distinct方法对集合进行去重操作。
方法二是使用Collectors.toList()方法。先使用stream的distinct方法去除重复项,再使用collect方法将去重后的结果收集到一个List中。
以上两种方法都可以实现根据某个字段对集合进行去重的功能。具体使用哪种方法取决于你的需求和代码实现的复杂程度。引用提供了具体示例代码供参考。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [stream根据某个字段去重(对象的某个字段去重)](https://blog.csdn.net/qq_41070393/article/details/126282175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [Java中对List去重 Stream去重的解决方法](https://download.csdn.net/download/weixin_38667403/12761286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [java8 List根据某个字段去重 支持多字段去重](https://blog.csdn.net/obitosbb/article/details/119764679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
strem流对对象集合的某个字段去重
Java 8中的流可以使用distinct()方法对对象集合中的某个字段进行去重。假设有一个Person类,其中包含id和name字段,可以使用以下代码根据id字段对Person对象集合进行去重操作:
```
List<Person> personList = new ArrayList<>();
//添加一些Person对象到personList
List<Person> distinctPersons = personList.stream()
.filter(distinctByKey(Person::getId))
.collect(Collectors.toList());
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
```
这个代码中,我们使用了一个自定义的distinctByKey()方法,它返回一个Predicate对象,该对象接受Function参数来提取对象的key。我们使用ConcurrentHashMap来存储已经出现过的key,因为ConcurrentHashMap是线程安全的。最后,我们使用filter()方法将不重复的Person对象留下来,并使用collect()方法将它们收集到一个新的List中。