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

dka*_*kaz 15 java lambda java-8 java-stream

所以让我假设我有一个Arraylist对象Animal.该类的对象是这样的:

class Animal{
    String Name;//for example "Dog"
    String Color
}
Run Code Online (Sandbox Code Playgroud)

我想要做的,是数不同的颜色在每个动物中存在多少ArrayList,把他们在一个Map<String,Integer>地方String是名称和Integer对不同颜色的数量.

例如,如果有4只黑狗和1只白色等同于放在地图上

map.put("Dog",2);
Run Code Online (Sandbox Code Playgroud)

我知道它可以使用,Stream但我不知道如何.

Hol*_*ger 19

您要做的是使用name属性作为键的分组操作.这很容易.Trickier将"不同颜色的数量"表示为下游收集器.由于JRE中没有这样的收集器,我们必须使用Set存储器构建一个收集器.请注意,即使有内置的,它也必须在引擎盖下使用类似的存储.所以我们将元素映射到颜色,将它们收集到Sets(这意味着仅保留不同的值)并通过查询大小来完成:

Map<String, Integer> map = animalStream.collect(
    Collectors.groupingBy(Animal::getName,
        Collectors.collectingAndThen(
            Collectors.mapping(Animal::getColor, Collectors.toSet()),
            Set::size)));
Run Code Online (Sandbox Code Playgroud)


Rap*_*oth 6

这应该工作:

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

这里有一些测试代码:

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

}
Run Code Online (Sandbox Code Playgroud)

Cat : 2
Dog : 2
Run Code Online (Sandbox Code Playgroud)

注意:这个答案的灵感来自这篇SO帖子:https://stackoverflow.com/a/30282943/1138523