2016-07-26 3 views
-4

목록이 cats이고 cats을 같은 colour으로 그룹화하고 이들을 owner으로 그룹화합니다. Java 8에서 이것을 어떻게합니까? owner3 1 고양이를 가지고,Java 8 스트림을 사용하여 중복 수집

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이 있습니다

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; 
    } 
} 

내가 데이터를 다음했다 말할 수 있습니다. 적절한 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)]} 
관련 문제