使用java 8统计列表中对象的属性

使用java 8统计列表中对象的属性,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,假设我有一个对象Animal的Arraylist。对象的该类如下所示: 类动物{ 字符串名称;//例如“Dog” 串色 } 我想做的是,计算ArrayList中每种动物有多少种不同的颜色,并将它们放在Map中,其中String是名称,Integer是不同颜色的数量 例如,如果有4条黑狗和1条白狗,那么地图上的等价物是 map.put(“狗”,2); 我知道可以使用Stream来完成,但我不知道怎么做。您要做的是使用name属性作为键。这是最简单的部分。更棘手的是将“不同颜色的计数”表示为下游

假设我有一个对象
Animal
Arraylist
。对象的该类如下所示:

类动物{
字符串名称;//例如“Dog”
串色
}
我想做的是,计算
ArrayList
中每种动物有多少种不同的颜色,并将它们放在
Map
中,其中
String
是名称,
Integer
是不同颜色的数量

例如,如果有4条黑狗和1条白狗,那么地图上的等价物是

map.put(“狗”,2);
我知道可以使用
Stream
来完成,但我不知道怎么做。

您要做的是使用name属性作为键。这是最简单的部分。更棘手的是将“不同颜色的计数”表示为下游收集器。因为JRE中没有这样的收集器,所以我们必须使用
存储构建一个收集器。请注意,即使有一个内置的,它也必须使用类似的存储在引擎盖下。因此,我们可以使用颜色(这意味着只保留不同的值)并通过查询大小:

Map<String, Integer> map = animalStream.collect(
    Collectors.groupingBy(Animal::getName,
        Collectors.collectingAndThen(
            Collectors.mapping(Animal::getColor, Collectors.toSet()),
            Set::size)));
Map Map=animalStream.collect(
Collectors.groupingBy(Animal::getName,
收藏,收藏,然后(
Collectors.mapping(Animal::getColor,Collectors.toSet()),
Set::size));
这应该可以:

    Map<String, Integer> map = animal.stream().collect(
            Collectors.groupingBy(
                    Animal::getName,
                    Collectors.collectingAndThen(
                            Collectors.mapping(Animal::getColor, Collectors.toSet()),
                            Set::size)
                    )
            );

注意:这个答案是从这篇SO帖子中得到启发的:

如果您愿意,可以使用Map::forEach作为测试代码:Map.forEach((key,value)->System.out.println(key+”:“+value));
public static void main(String[] args) {
    List<Animal> animal = new ArrayList<>();
    animal.add(new Animal("Dog","black"));
    animal.add(new Animal("Dog","black"));
    animal.add(new Animal("Dog","blue"));
    animal.add(new Animal("Cat","blue"));
    animal.add(new Animal("Cat","white"));

    Map<String, Integer> map = animal.stream().collect(
            Collectors.groupingBy(
                    Animal::getName,
                    Collectors.collectingAndThen(
                            Collectors.mapping(Animal::getColor, Collectors.toSet()),
                            Set::size)
                    )
            );

    for(Entry<String, Integer> entry:map.entrySet()) {
        System.out.println(entry.getKey()+ " : "+entry.getValue());
    }

}
Cat : 2
Dog : 2