有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

谢谢你,清洁工


共 (1) 个答案

  1. # 1 楼答案

    解决方案:

    解决方案是:

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