我有过
class Activity {
int id;
ActivityType activityType;
}
class ActivityType {
int id;
}
class Tournament {
int id;
List<Activity> activities;
}我有一个
List<Tournament> tournaments;从那我需要
Map<Tournament, Map<ActivityType, Map<Integer, Activity>>>(其中Integer是activityId)
如何使用Java 8实现这个目标?
发布于 2017-03-14 14:45:46
这是我能想到的最好的java8。
Map<Tournament, Map<Activity, Map<Integer, Activity>>> map = tournaments.stream()
.collect(toMap(identity(),
t -> t.getActivities().stream()
.collect(groupingBy(A::getActivityType(),
a -> toMap(A::getId, identity())))));发布于 2017-03-14 14:16:17
如果我正确理解,Map<Integer, Activity>总是只包含一个元素。在这种情况下,它看起来更像toMap而不是groupingBy。类似于:
Map<Tournament, Map<Activity, Map<Integer, Activity>>> map = tournaments.stream()
.collect(toMap(t -> t,
t -> t.getActivities().stream().collect(toMap(a -> a, a -> map(a)))));使用此辅助方法:
private static Map<Integer, Activity> map(Activity a) {
Map<Integer, Activity> m = new HashMap<> ();
m.put(a.getId(), a);
return m;
}发布于 2017-03-14 14:37:27
如果您有一种方法从jdk-9获取Collectors.flatMapping (我认为它存在于StreamEx库中),那么它可以如下所示:
Stream.of(new Tournament()).collect(Collectors.groupingBy(Function.identity(),
Collectors.flatMapping(t -> t.getActivities().stream(),
Collectors.groupingBy(Activity::getActivityType,
Collectors.toMap(Activity::getId, Function.identity()))
)));与StreamEx可能如下所示:
Stream.of(new Tournament()).collect(Collectors.groupingBy(Function.identity(),
MoreCollectors.flatMapping(t -> t.getActivities().stream(),
Collectors.groupingBy(Activity::getActivityType,
Collectors.toMap(Activity::getId, Function.identity())))));https://stackoverflow.com/questions/42788161
复制相似问题