stream流按照指定字段进行去重
时间: 2024-01-30 12:03:05 浏览: 107
可以使用Java 8的Stream API来按照指定字段进行去重。假设我们有一个包含Person对象的列表,每个Person对象都有一个唯一的id和name字段,我们想按照name字段进行去重,可以使用如下代码:
```
List<Person> distinctByName = personList.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))),
ArrayList::new));
```
上面的代码首先使用`Collectors.toCollection()`方法将Stream中的元素添加到一个基于TreeSet的集合中,这个TreeSet使用`Comparator.comparing()`方法按照Person对象的name字段进行比较,从而实现了按照name字段去重。然后使用`Collectors.collectingAndThen()`方法将这个TreeSet转换成一个ArrayList。
如果需要按照多个字段进行去重,只需要在`Comparator.comparing()`方法中传入多个字段的比较器即可。
相关问题
stream流map 多个字段_stream流根据对象指定字段去重
可以使用Java 8的Stream流和Collectors.toMap()方法来实现根据指定字段去重。
假设有一个对象列表List,对象中包含多个字段,我们要根据其中一个字段去重,可以按照以下步骤进行:
1. 将List转换为Stream流。
2. 使用Collectors.toMap()方法,指定对象中要去重的字段作为key,使用Function.identity()作为value,生成一个Map。
3. 使用Map.values()方法获取Map中去重后的value集合,生成一个List。
示例代码如下:
```
List<MyObject> list = // 获取对象列表
List<MyObject> distinctList = list.stream()
.collect(Collectors.toMap(MyObject::getFieldToDistinct, Function.identity(), (o1, o2) -> o1))
.values()
.stream()
.collect(Collectors.toList());
```
其中,MyObject为对象类,getFieldToDistinct()为获取要去重的字段的方法。在Collectors.toMap()方法中,第一个参数为key的获取方式,第二个参数为value的获取方式,第三个参数为去重时的合并方式,这里使用o1 -> o1表示去重时保留第一个对象。
注意,如果要去重的字段可能存在null值,需要在第一个参数中加入判断,例如:
```
.collect(Collectors.toMap(obj -> obj.getFieldToDistinct() != null ? obj.getFieldToDistinct() : "", Function.identity(), (o1, o2) -> o1))
```
这样可以保证去重时不会因为null值而出错。
stream流按照某个字段去重
可以使用Java 8中的流(Stream)和Collectors工具类来实现按照某个字段去重:
假设有一个Person类,有两个属性name和age,我们要按照name字段去重:
```java
public class Person {
private String name;
private int age;
// 省略getter和setter方法
}
```
可以使用以下代码:
```java
List<Person> persons = new ArrayList<>();
// 添加数据到persons
List<Person> distinctPersons = persons.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))),
ArrayList::new
));
```
这里使用了Collectors的collectingAndThen()方法,该方法可以将Collector转换为另一种类型。
首先使用toCollection()方法将流中元素收集到TreeSet中,通过传入Comparator.comparing()方法来指定按照哪个字段去重。然后再使用ArrayList::new将TreeSet转换为ArrayList,即去除Set中的重复元素后,将结果转换为List返回。
阅读全文
相关推荐















