@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之前创建映射?
studentList
.forEach(student -> {
student
.getStatusAndMarks()
.keySet().stream()
.map(key -> map.put(key, statusKeyImportantMessage));
});发布于 2020-03-31 02:30:58
如果您使用forEach来再次迭代键集,那么您已经足够接近了:
Map<Status, Student> map = new HashMap<>();
studentList.forEach(student ->
student.getStatusAndMarks().keySet()
.forEach(k -> map.put(k,student)));与另一个答案中所述的类似表示将是
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));请注意,合并功能是用稍后在迭代中找到的相同状态覆盖新学生。另一方面,真正方便查询的信息是给定状态的学生列表。可以使用类似的流管道对它们进行分组,如下所示:
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())));发布于 2020-03-30 22:27:28
您可以尝试如下所示:
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,它可以替换为:
status -> new AbstractMap.SimpleEntry(status, student)https://stackoverflow.com/questions/60931914
复制相似问题