【问题标题】:Collecting duplicates using a Java 8 stream [duplicate]使用 Java 8 流收集重复项 [重复]
【发布时间】:2016-07-26 11:57:07
【问题描述】:

我有一个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;
    } 
}

假设我有以下数据:

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 只猫。

【问题讨论】:

  • “收集相同颜色的猫”是什么意思。您想按颜色和所有者分组,还是按特定颜色过滤?
  • 首先尝试使用普通循环来完成您的任务,这样您就可以看到算法,该算法可以转换为Stream API。看来您必须这样做:stackoverflow.com/a/33254512/4105457

标签: java lambda java-8


【解决方案1】:

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)]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2015-11-10
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多