使用Java 8流收集重复项

cod*_*key -4 java lambda java-8

我有一个名单cats,我想组cats具有相同的colour和他们组owner。如何在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;
    } 
}
Run Code Online (Sandbox Code Playgroud)

可以说我有以下数据:

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);
Run Code Online (Sandbox Code Playgroud)

我期望其中的地图owner1有两只猫,owner2有1只,owner3有1只猫。

tob*_*s_k 5

使用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)]}
Run Code Online (Sandbox Code Playgroud)