2016-07-26 21 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); 

を私はowner3は1匹の猫を持っている、owner2は1を持って、2匹の猫を持っているowner1のマップを期待しています。適切なgetterメソッドと

+3

あなたは「同じ色で猫を収集する」とはどういう意味ですか。色と所有者でグループ化するか、特定の色でフィルタリングしたいですか? – Mico

+2

まず、単純なループであなたのタスクを実行しようとすると、 'Stream' APIに変換できるアルゴリズムが見えます。あなたはこれを次のようにしなければならないようです:http://stackoverflow.com/a/33254512/4105457 – Flown

答えて

4

使用Collectors.groupingBy

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)]} 
関連する問題