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)
这应该工作:
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
| 归档时间: |
|
| 查看次数: |
4007 次 |
| 最近记录: |