首页 > 解决方案 > Java、流、收集器、函数式编程:如何制作复式映射?

问题描述

我正在尝试理解流和地图。

我有一个“马”对象流。每匹“马”都有“品种”和“喜欢的食物”。

我要做的是创建一个看起来像双输入数组的东西(可能是地图),将品种放入行中,将最喜欢的食物放入列中。

在行和列的交汇处,我要数马。

要将马按品种分组,我必须这样做:

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

谢谢你,扫地机

标签: javafunctional-programmingjava-stream

解决方案


解决方案 :

解决方案是:

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

推荐阅读