2016-07-26 63 views
-4

我有一個cats的列表,並且我想將cats與相同的colour分組在一起,並將它們組爲owner。我如何在Java 8中執行此操作?使用Java 8流收集重複項

public class Cat{ 
    private String name; 
    private Owner owner; 
    private String color; 
    public Cat(String name,Owner owner,String color){ 
     this.name=name; 
     this.owner= owner; 
     this.color= color; 
    } 
} 

public class Owner{ 
    private String name; 
    public Owner(String name){ 
     this.name= name; 
    } 
} 

可以說我有以下數據:

Owner owner1= new Owner("John"); Owner owner2= new Owner("Smith"); 
Owner owner3= new Owner("Scott"); 
Cat cat1 = new Cat ("Cat1",owner1,"Brown"); 
Cat cat2 = new Cat ("Cat2",owner2,"Black"); 
Cat cat3 = new Cat ("Cat3",owner1,"Brown"); 
Cat cat4 = new Cat ("Cat4",owner3,"White"); 

List<Cat> catList = new ArrayList<>(); 
catList.add(cat1); 
catList.add(cat2); 
catList.add(cat3); 
catList.add(cat4); 

我期待的owner1有兩個貓圖,owner2有1個,owner3有1家貓。

+3

你的意思是什麼與「收集與相同顏色的貓」。您想按顏色和所有者進行分組,或者您想按特定顏色進行過濾? – Mico

+2

首先嚐試使用普通循環執行任務,以便可以看到可以轉換爲「Stream」API的算法。看起來你必須這樣做:http://stackoverflow.com/a/33254512/4105457 – Flown

回答

4

使用Collectors.groupingBy用適當的getter方法:

Map<Owner, List<Cat>> byOwner = catList.stream() 
     .collect(Collectors.groupingBy(Cat::getOwner)); 
// {Owner(name=John)=[Cat(name=Cat1), Cat(name=Cat3)], Owner(name=Scott)=[Cat(name=Cat4)], Owner(name=Smith)=[Cat(name=Cat2)]} 

Map<String, List<Cat>> byColor = catList.stream() 
     .collect(Collectors.groupingBy(Cat::getColor)); 
// {Brown=[Cat(name=Cat1), Cat(name=Cat3)], White=[Cat(name=Cat4)], Black=[Cat(name=Cat2)]}