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.......