stream.collect(Collectors.toList())去重問題
阿新 • • 發佈:2021-01-14
java8 stream原始碼中stream.collect(Collectors.toList())去重
**
利用 java8 stream對list或者set中帶有(“aaa”,“88888”)等複雜欄位去重。如若失敗可能是equals方法原因,需要重寫hashCode(), equals(Object obj)方法。
測試發現如果hashCode()的欄位為Long型別,即不是String的話equals(Object obj)方法中的this.id==other.getId()應將換成this.id.equals(other.getId(),測試即可成功。
菜鳥小白zzh分享
package zzh;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
EqualsObj obj1 =new EqualsObj("1","xxx" );
EqualsObj obj2 =new EqualsObj("1","88888");
EqualsObj obj3 =new EqualsObj("2","xxx");
List<EqualsObj> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
list.add(obj3);
list = list. stream().distinct().collect(Collectors.toList());
Set<EqualsObj> set = new HashSet<>();
set.add(obj1);
set.add(obj2);
set.add(obj3);
}
static class EqualsObj{
private String id;
private String name;
public EqualsObj(String id,String name){
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (id == null ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
//地址相等
if(this == obj){
return true;
}
if(obj == null){
//非空性:對於任意非空引用x,x.equals(null)應該返回false。
return false;
}
if(obj instanceof EqualsObj){
EqualsObj other = (EqualsObj) obj;
//需要比較的欄位相等,則這兩個物件相等
if(this.id==other.getId()){
return true;
}
}
return false;
}
}
}