当前位置: 首页 > 知识库问答 >
问题:

基于子对象列表从列表创建映射

於宾白
2023-03-14

我有一个包含子对象列表的类,如下所示:

class Student {
   private String name;
   private List<String> subjects;
}

我有一个学生类列表,如下所示:

Student [name = "John", subjects = ["Physics", "Math", "Chemistry"]]
Student [name = "Max",  subjects = ["Physics", "Chemistry"]]
Student [name = "Chris",  subjects = ["Chemistry"]]
Physics = [Student [name = "John", subjects = ["Physics", "Math", "Chemistry"]], 
          Student [name = "Max",  subjects = ["Physics", "Chemistry"]]],
Chemistry = [Student [name = "John", subjects = ["Physics", "Math", "Chemistry"]], 
          Student [name = "Max",  subjects = ["Physics", "Chemistry"]], 
          Student [name = "Chris",  subjects = ["Chemistry"]]] 
Math = [Student [name = "John", subjects = ["Physics", "Math", "Chemistry"]]]

我可以使用传统的foreach循环对数据进行分组,但我想为此使用stream API,但不能这样做。你能帮忙吗?

共有1个答案

常俊侠
2023-03-14

一种方法是将学生映射到多对(subject,student),然后按主题分组。

List<Student> students = Arrays.asList(
        new Student("John", Arrays.asList("Physics", "Math", "Chemistry")),
        new Student("Max", Arrays.asList("Physics", "Chemistry")),
        new Student("Chris", Arrays.asList("Chemistry"))
);

Map<String, List<Student>> result = students.stream()
        .flatMap(student -> student
                .getSubjects()
                .stream()
                .map(s -> new Object[]{s, student})
        )
        .collect(
                Collectors.groupingBy(pair -> (String) pair[0], 
                Collectors.mapping(pair -> (Student) pair[1], Collectors.toList()))
        );

System.out.println(result);
 类似资料:
  • 问题内容: 我有以下问题: 如何将以下代码片段转换为Java 8 lambda样式? 不知道,从以下内容开始: 问题答案: 您需要将自己的流放入列表: 有关其他信息,请访问文档 只是可以写成的另一种形式(因为类型将由编译器推断)

  • 毫无头绪,从以下入手:

  • 使用Java8 lambdas,在给定可能键的和的情况下,有效创建新的的“最佳”方法是什么?在这种情况下,您将得到一个包含可能的键的并希望生成一个其中是基于的某个方面构造的某种类型,即映射值类型。 我已经研究了几种方法,但认为一种方法比另一种方法更好(可能有一个例外--参见代码)。我将把“最佳”解释为代码清晰度和运行时效率的结合。这些是我想出来的。我肯定有人能做得更好,这是这个问题的一个方面。我不

  • 问题内容: 与列表变平相反。 给定一个列表和一个长度为n的列表,返回一个长度为n的子列表的列表。 一个例子: 如果列表是: n是: 返回: 有没有一种更雄辩/简洁的方法? 顺便说一句,将列表追加到列表时(在上面的上下文中)是首选: 要么: 鉴于(根据Summerfeild的“ Python 3编程”),它们是一样的吗? 谢谢。 问题答案: 这样的列表列表可以使用列表理解来构造: 还有石斑鱼成语:

  • 问题内容: 如何在Python中创建对象(类实例)列表? 还是这是不良设计的结果?我需要这个原因是因为我有不同的对象,并且需要在以后的阶段中处理它们,所以我将继续将它们添加到列表中,然后再调用它们。 问题答案: 存储对象实例列表非常简单