stream流中根据某个参数移除重复数据 distubct
时间: 2024-10-08 21:18:27 浏览: 35
在Java Stream API中,`distinct()` 这个操作用于移除集合中的重复元素,但它本身并不关心输入元素的具体内容,而是基于元素的引用去判断是否重复。如果你想根据元素的内容(如某个属性值、对象状态等)来去除重复,你需要自定义一个比较规则或者提供一个函数作为参数。
例如,假设有一个 `Person` 类,你想根据 `name` 属性去除重复,你可以这样做:
```java
List<Person> people = ... // 假设这是包含Person对象的列表
// 使用Lambda表达式指定比较规则,如果两个人的名字不同则认为是唯一的
people.stream()
.distinct(Comparator.comparing(Person::getName))
.collect(Collectors.toList());
```
在这里,`Comparator.comparing(Person::getName)` 创建了一个比较器,它会按照 `Person` 的 `name` 属性来比较元素,只有当两个名字不同时,`distinct()` 才会认为它们是唯一的。
如果你想要删除的是基于某个字段生成的新对象的重复,比如某个映射的键,可以先将对象转化为键(如 `map -> map.getKey()`),然后利用 `distinctBy` 来操作:
```java
Map<String, String> map = ... // 假设是String类型的map
// 使用Lambda表达式去除基于key的重复
map.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, // 如果有冲突就保留第一个
LinkedHashMap::new // 使用LinkedHashMap保持插入顺序
));
```
阅读全文