【发布时间】:2019-09-03 00:04:35
【问题描述】:
我有一个函数返回一个Map<String, Set<String>>,Java 8 之前的代码:
Map<String, Set<String>> degreeMap = new HashMap<>();
for(Course course : courses){
Set<String> cList = degreeMap.get(course.getCourseLevel().toString());
if(Objects.nonNull(cList)){
cList.addAll(course.getMasterDegree()); //this is what i want to append to the old set
degreeMap.put(course.getCourseLevel().toString(), cList);
} else{
degreeMap.put(course.getCourseLevel().toString(), new HashSet<>(course.getMasterDegree()));
}
}
return degreeMap;
返回课程级别的地图 -> 度数集。
例如,它读取所有课程并返回如下地图:
{"undergraduate" : ["BTech", "BSc", "BE"],
"masters": ["MTech", "MBA"],
"Executive": ["PGDBM", "EECP"]}
这是我的课程:
public class Course {
private List<String> masterDegree;
private CourseLevel courseLevel;
}
但我想用 Java 8 风格编写这段代码。为此,我尝试了这个:
Map<String, Set<String>> degreeMap = courses.stream().collect(
Collectors.groupingBy(c -> c.getCourseLevel().toString(),
Collectors.mapping(c -> c.getMasterDegree(), Collectors.toSet()))
);
这不起作用,我收到以下编译时错误:
不存在类型变量的实例,因此 List 符合 String 推断变量 T 具有不兼容的边界:等式约束:String 下界:List
任何建议,如何实现?
【问题讨论】:
-
在我看来,您正在寻找与旧版本中的 Java-9 等效的
flatMapping。 -
@GhostCat 尝试编辑问题以使其足够相关。希望现在清楚。
-
@Naman 感谢您解决了这场战斗:P
-
for(Course course : courses) degreeMap.computeIfAbsent(course.getCourseLevel() .toString(), x -> new HashSet<>()) .addAll(course.getMasterDegree());顺便说一句,即使在您的 Java 8 之前的版本中,也没有理由在addAll之后再次将put同一个列表放入Map。
标签: java collections java-8 group-by collectors