我正在尝试理解流和 map 。
我有一个“马”对象的流。每匹“马”都有一个“品种”和“最喜欢的食物”。
我想做的是创建一个看起来像双条目数组的东西(可能是 map ),将品种放入行中,将最喜欢的食物放入列中。
在行和列的交叉点,我想数一下马的数量。
要按品种对马进行分组,我必须这样做:
Map<Breed, List<Horse>> map = horsesStream.collect(Collectors.groupingBy(h -> h.breed));
按照最喜欢的食物对马进行分组,几乎是同一件事:
Map<FavoriteFood, List<Horse>> map = horsesStream.collect(Collectors.groupingBy(h -> h.favoriteFood));
为了让计数按食物分组,我这样做:
Map<Food, Long> map = horsesStream.collect(Collectors.groupingBy((h-> h.favoriteFood), Collectors.counting());
如何将这三者结合起来?
我尝试过:
Map<Breed, Map<Food, List<Horse>>> map=
horsesStream.collect(Collectors.groupingBy((h -> h.breed), Collectors.groupingBy(h-> h.favoriteFood)));
但是现在,我根本不知道该怎么办。
你能帮我吗?也许有一些线索?
正确答案是:
Map<Breed, Map<Food, Long>> map = horsesStream.collect(Collectors.groupingBy((c -> c.breed),
Collectors.groupingBy(c -> c.favoriteFood, Collectors.counting())));
谢谢你,扫地工
最佳答案
解决方案:
解决方案是:
public static Map<Breed, Map<Food, Long>> breedFoodCount (List<Horse> horses){
// Get a stream
Stream<Horse> horsesStream = horses.stream();
return horsesStream.collect(Collectors.groupingBy((c -> c.breed),
Collectors.groupingBy(c -> c.favoriteFood, Collectors.counting())));
}
关于Java、流、收集器、函数式编程 : How to make a double entry map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62136646/