首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列表和映射映射到映射中

将列表和映射映射到映射中
EN

Stack Overflow用户
提问于 2020-03-30 21:43:53
回答 2查看 59关注 0票数 3
代码语言:javascript
运行
复制
@Getter 
static class Student {
    private Map<Status, Marks> statusAndMarks; 
}

class Status {
}

class Marks {
}

Map<Status, Student> map = new HashMap<>();
for (Student student : studentList) {
    for (Status status : student.getStatusAndMarks().keySet()) {
        map.put(status, student);
    }
}

如何在Java8中以函数式风格编写上述代码?我已经写了下面的代码,但是我怎么写我的代码的结果是一个不可变的映射,我不需要在lambda之前创建映射?

代码语言:javascript
运行
复制
studentList
    .forEach(student -> {
        student
        .getStatusAndMarks()
        .keySet().stream()
        .map(key -> map.put(key, statusKeyImportantMessage));
        });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-31 02:30:58

如果您使用forEach来再次迭代键集,那么您已经足够接近了:

代码语言:javascript
运行
复制
Map<Status, Student> map = new HashMap<>();
studentList.forEach(student -> 
        student.getStatusAndMarks().keySet()
                .forEach(k -> map.put(k,student)));

与另一个答案中所述的类似表示将是

代码语言:javascript
运行
复制
Map<Status, Student> map = studentList.stream()
        .flatMap(s -> s.getStatusAndMarks().keySet()
                .stream()
                .map(status -> new AbstractMap.SimpleEntry<>(status, s)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b));

请注意,合并功能是用稍后在迭代中找到的相同状态覆盖新学生。另一方面,真正方便查询的信息是给定状态的学生列表。可以使用类似的流管道对它们进行分组,如下所示:

代码语言:javascript
运行
复制
Map<Status, List<Student>> statusWiseStudent = studentList.stream()
        .flatMap(s -> s.getStatusAndMarks().keySet()
                .stream()
                .map(status -> new AbstractMap.SimpleEntry<>(status, s)))
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
票数 1
EN

Stack Overflow用户

发布于 2020-03-30 22:27:28

您可以尝试如下所示:

代码语言:javascript
运行
复制
studentList.stream()
        .flatMap(student -> student.getStatusAndMarks()
                .keySet().stream().map(status -> Map.entry(status, student)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Map.entry来自Java9。对于较低版本的Java,它可以替换为:

代码语言:javascript
运行
复制
status -> new AbstractMap.SimpleEntry(status, student)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60931914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档