Java、流、收集器、函数式编程 : How to make a double entry map?

标签 java functional-programming java-stream

我正在尝试理解流和 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/

相关文章:

Java继承概念指的是父类(super class)构造函数吗?

java - 如何从包含 XML 的字符串中删除第一行?

scala - 如何将函数映射到函数的 HList 从某种类型到某种类型?

Java 8 : Multiple conditions in map function of stream

Java:Flat List<Map<String, Object>> 到 Hierarchical List<Map<String, Object>>

Java lambda : combine doSomething() and removeIf() in one iteration

java - SharedPreferences.Editor apply() 失败

java - FunctionalInterface Comparator 有 2 个抽象方法

javascript - 代码与 ramda.js 有什么区别?

math - 函数程序为 "more tractable mathematically"的说法是什么意思?