java8兩個集合取交集、並集與差集


Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數據。

Stream 使用一種類似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。

Stream API可以極大提高Java程序員的生產力,讓程序員寫出高效率、干凈、簡潔的代碼。

這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。

元素流在管道中經過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結果。

(以上高大上的名詞解釋內容來自網絡,樓主一臉懵B...總之一句話,集合間的去重操作,在java8的流式操作中,變得很優雅,/花雞)

比如有以下類:

1 Class Person{
2     private int id;
3     private String name;
4 public Person(){} 5 public Person(int id, String name){ 6 this.id=id; 7 this.name = name; 8 } 9 }

然后有以下倆集合:

 1 List<Person> listA = new ArrayList<>();
 2 List<Person> listB = new ArrayList<>();
3 listA.add(new Person(1,"aa")); 4 listA.add(new Person(1,"bb")); 5 listA.add(new Person(1,"cc")); 6 listA.add(new Person(1,"dd")); 7 8 listB.add(new Person(1,"aa")); 9 listB.add(new Person(1,"bb")); 10 listB.add(new Person(1,"cc"));

現在希望集合listA與listB之間發生點事,擦出點火花,比如標題上說的求交集(listA ∩ ListB)、求並集(listA ∪ listB)、求差集(listA - listB)。

由於兩集合里保存的是對象信息,它們在進行如上操作時,要有比較判斷依據,比如,id值和姓名值相同的情況下,認為倆個集合保存的是相同的對象數據。

此時,我們需要先重寫Person類的equals方法,如下:

Class Person{
     private int id;
     private String name;
public Person(){} public Person(int id, String name){ this.id=id; this.name = name; } @override public boolean equals(Object obj){ if(this == obj){ return true; } if(obj == null){ return false; } if(getClass() != obj.getClass()){ return false; } Person other = (Person) obj; if(id != other.id){ return false; } if(name == null){ if(other.name != null){ return false; } }else if(!name.equals(other.name)){ return false; } return true; } }

最后,優雅地寫出集合listA與listB之間發生的那些事吧。

交集(listA ∩ ListB):

List<Person> listC = listA.stream().filter(item -> listB.contains(item)).collect(Collectors.toList());

listC中的元素有:屬性name值為 aa, bb, cc 的對象。

 

並集(listA ∪ listB):

//先合體
listA.addAll(listB);
//再去重
List<Person> listC = listA.stream().distinct().collect(Collectors.toList());

listC中的元素有:屬性name值為 aa, bb, cc ,dd的對象。

 

差集(listA - listB):

List<Person> listC = listA.stream().filter(item -> !listB.contains(item)).collect(Collectors.toList());

listC中的元素有:屬性name值為 dd的對象。

火花擦完了, that's all.......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM