【问题标题】:java collectors with grouping by具有分组依据的 java 收集器
【发布时间】:2021-03-14 05:18:42
【问题描述】:

我有一个MyClass 的列表

public class MyClass {
  private String level;
  private String grade;
  private String value;
  
  // constructor, getters, setters
}
List<MyClass> myList = new ArrayList<>();
myList.add(new MyClass("Lv1", "A", "value"));
myList.add(new MyClass("Lv2", "B", "value"));
myList.add(new MyClass("Lv2", "B", "value"));
myList.add(new MyClass("Lv3", "C", "value"));
myList.add(new MyClass("Lv3", "D", "value"));

还有一个grade list

List<String> gradeList = new ArrayList<>();
gradeList.add("A");
gradeList.add("B");
gradeList.add("C");
gradeList.add("D");
gradeList.add("E");

我想根据gradeList获得计数

Map&lt;String, Map&lt;String, Long&gt;&gt; 格式。

我不知道如何将gradeList 应用于 myList 流。

// I guess

        myList.stream().collect(Collectors.groupingBy(
            MyClass::getLevel,
            Collectors.groupingBy(
                // do something with gradeList
                , Collectors.counting())));
// expected result : 
{
  "Lv1"={"A"=1,"B"=0,"C"=0,"D"=0,"E"=0, }, 
  "Lv2"={"A"=0,"B"=2,"C"=0,"D"=0,"E"=0, }, 
  "Lv3"={"A"=0,"B"=0,"C"=1,"D"=1,"E"=0, }, 
}

我可以听听你的意见吗?

【问题讨论】:

    标签: java java-stream collectors groupingby


    【解决方案1】:

    您可以链接两个 groupingBy() 收集器,但输出不会包含计数为 0 的等级:

    Map<String,Map<String,Long>> grouped =
        myList.stream().collect(Collectors.groupingBy(
            MyClass::getLevel,
            Collectors.groupingBy(
                MyClass::getGrade,
                Collectors.counting())));
    

    您可以使用第二个语句添加计数为 0 的等级:

    grouped.forEach ((k,v)-> {gradeList.forEach (grade -> v.putIfAbsent (grade, 0L));});
    

    第一条语句创建的groupedMap

    {Lv1={A=1}, Lv3={C=1, D=1}, Lv2={B=2}}
    

    第二条语句后的groupedMap

    {Lv1={A=1, B=0, C=0, D=0, E=0}, Lv3={A=0, B=0, C=1, D=1, E=0}, Lv2={A=0, B=2, C=0, D=0, E=0}}
    

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 2019-04-29
      • 2019-08-31
      • 2020-06-09
      • 2021-04-30
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2016-01-25
      相关资源
      最近更新 更多