使用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