【问题标题】:How to group list of data based on one field如何根据一个字段对数据列表进行分组
【发布时间】:2020-07-15 11:11:56
【问题描述】:

我有一个自定义类数据列表,我想根据一个字段对它们进行分组,并且值应该是另一个字段。举个例子吧。

List<Student> list = new ArrayList<>();
list.add(new Student(1001, "Class 1", "Jon"));
list.add(new Student(1002, "Class 1", "Eliana"));
list.add(new Student(1003, "Class 2", "Piter"));
list.add(new Student(1004, "Class 3", "Joy"));
list.add(new Student(1005, "Class 2", "Anderson"));
list.add(new Student(1006, "Class 1", "Ram"));
list.add(new Student(1007, "Class 1", "Mohan"));

现在我想根据类别对这些数据进行分组。预期的输出应该是一个映射,其中包含作为类的键和作为学生姓名列表的值。

{"Class 1" -> ["Jon", "Eliana", "Ram", "Mohan"]}
{"Class 2" -> ["Piter", "Anderson"]}
{"Class 3" -> ["Joy"]}

我想使用 java 8 流功能来获得它。我尝试这样做,我可以将整个对象分组到一个地图中,因为键是类名,值是学生列表。但我的要求是获得价值作为唯一的学生姓名列表。

我的代码是这样的:

list.stream().collect(Collectors.groupingBy(Students::getClass));

【问题讨论】:

  • 您可以使用mapping收藏者:list.stream().collect(Collectors.groupingBy(Students::getClass,Collectors.mapping(Student:getName,toList())));
  • 谢谢老兄,它似乎工作了
  • 您可以将其添加为答案,以便其他人轻松获得。

标签: java algorithm stream java-stream


【解决方案1】:

从上面的cmets部分,可以这样完成:

Map<EligibilityRequest, List<List<String>>> result = 
  list.stream()
    .collect(Collectors.groupingBy(Student::getClass,
      Collectors.mapping(Student::getName,  toList())
    ));

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多