stream流 distinct 多个字段去重
时间: 2023-09-28 15:07:47 浏览: 111
可以使用 Java 8 的 Stream API 中的 `distinct` 方法结合自定义的 `equals` 和 `hashCode` 方法来实现多个字段的去重。具体代码如下:
```java
List<MyObject> list = Arrays.asList(
new MyObject("A", 1),
new MyObject("B", 2),
new MyObject("A", 1),
new MyObject("C", 3),
new MyObject("B", 2));
List<MyObject> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctList);
```
其中,`MyObject` 为自定义的对象,包含两个字段 `field1` 和 `field2`。`equals` 和 `hashCode` 方法如下:
```java
class MyObject {
private String field1;
private int field2;
public MyObject(String field1, int field2) {
this.field1 = field1;
this.field2 = field2;
}
// 自定义equals方法,比较两个字段是否相等
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObject myObject = (MyObject) o;
if (field2 != myObject.field2) return false;
return field1 != null ? field1.equals(myObject.field1) : myObject.field1 == null;
}
// 自定义hashCode方法,计算两个字段的hashCode值
@Override
public int hashCode() {
int result = field1 != null ? field1.hashCode() : 0;
result = 31 * result + field2;
return result;
}
// getter和setter方法
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public int getField2() {
return field2;
}
public void setField2(int field2) {
this.field2 = field2;
}
// toString方法,方便输出
@Override
public String toString() {
return "MyObject{" +
"field1='" + field1 + '\'' +
", field2=" + field2 +
'}';
}
}
```
运行结果为:
```
[MyObject{field1='A', field2=1}, MyObject{field1='B', field2=2}, MyObject{field1='C', field2=3}]
```
可以看到,相同的两个对象被去重了,只剩下了不同的对象。
阅读全文