首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在对象中使用List属性在groupingBy of groupingBy in java8

如何在对象中使用List属性在groupingBy of groupingBy in java8
EN

Stack Overflow用户
提问于 2017-03-14 14:05:30
回答 3查看 403关注 0票数 2

我有过

代码语言:javascript
复制
class Activity {
    int id;
    ActivityType activityType;
}
class ActivityType {
    int id;
}
class Tournament {
    int id;
    List<Activity> activities;
}

我有一个

代码语言:javascript
复制
List<Tournament> tournaments;

从那我需要

代码语言:javascript
复制
Map<Tournament, Map<ActivityType, Map<Integer, Activity>>>

(其中IntegeractivityId)

如何使用Java 8实现这个目标?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-14 14:45:46

这是我能想到的最好的java8。

代码语言:javascript
复制
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())))));
票数 0
EN

Stack Overflow用户

发布于 2017-03-14 14:16:17

如果我正确理解,Map<Integer, Activity>总是只包含一个元素。在这种情况下,它看起来更像toMap而不是groupingBy。类似于:

代码语言:javascript
复制
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)))));

使用此辅助方法:

代码语言:javascript
复制
private static Map<Integer, Activity> map(Activity a) {
  Map<Integer, Activity> m = new HashMap<> ();
  m.put(a.getId(), a);
  return m;
}
票数 1
EN

Stack Overflow用户

发布于 2017-03-14 14:37:27

如果您有一种方法从jdk-9获取Collectors.flatMapping (我认为它存在于StreamEx库中),那么它可以如下所示:

代码语言:javascript
复制
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可能如下所示:

代码语言:javascript
复制
 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())))));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42788161

复制
相关文章

相似问题

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