Java 8 API添加了一個新的抽象稱爲流Stream,可讓你以一種聲明的方式處理數據。java
Stream 使用一種相似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。程序員
Stream API能夠極大提升Java程序員的生產力,讓程序員寫出高效率、乾淨、簡潔的代碼。數據庫
這種風格將要處理的元素集合看做一種流, 流在管道中傳輸, 而且能夠在管道的節點上進行處理, 好比篩選, 排序,聚合等。網絡
元素流在管道中通過中間操做(intermediate operation)的處理,最後由最終操做(terminal operation)獲得前面處理的結果。ide
(以上高大上的名詞解釋內容來自網絡,樓主一臉懵B...總之一句話,集合間的去重操做,在java8的流式操做中,變得很優雅,/花雞)this
好比有如下類:spa
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 }
而後有如下倆集合:code
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值和姓名值相同的狀況下,認爲倆個集合保存的是相同的對象數據。blog
此時,咱們須要先重寫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.......