1. 程式人生 > 其它 >stream.collect(Collectors.toList())去重問題

stream.collect(Collectors.toList())去重問題

技術標籤:javajava

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; } } }