首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8流如何在结果groupingBy中groupingBy?

Java8流如何在结果groupingBy中groupingBy?
EN

Stack Overflow用户
提问于 2016-07-07 19:01:55
回答 2查看 3.7K关注 0票数 1

如何在groupingBy LawInfoType中找到所有游戏的最大LawInfo by date?

我有一个简单的模型:

代码语言:javascript
复制
public enum Game {
    football,
    hokey,
    golf,
    basketball
}

public class LawInfo {
    private Date minDate;
    private State state;
    private LawInfoType textType;
    private String lawInfoText;
    private Game game;
}

public enum LawInfoType {
     big, middle , small;
}

public enum State {
    draft, ready, cancel;
}

主要测试

代码语言:javascript
复制
 List<LawInfo> list = new ArrayList<>();

        LawInfo info = null;
        Random random = new Random(123);
        for (int i = 0; i < 3; i++) {

            for (State state : State.values()) {
                for (LawInfoType lawInfoType : LawInfoType.values()) {
                    for (Game game : Game.values()) {
                        info = new LawInfo(new Date(random.nextLong()), state, lawInfoType, "TEXT", game);
                        list.add(info);
                    }

                }
            }
        }

        Predicate<LawInfo>  isReady = l->l.getState().equals(State.ready);


  Map<LawInfoType, List<LawInfo>> map0 = list.stream()
                .filter(isReady)
                .collect(groupingBy(LawInfo::getTextType)); //!!!????

但我需要进入每组最大按日期分组按游戏

代码语言:javascript
复制
like this : Map<LawInfoType, List<LawInfo>> 

小->LawInfo(足球,最大日期),LawInfo(传球,最大日期),LawInfo(高尔夫,最大日期),LawInfo(篮球,最大日期)

中间->LawInfo(足球,最大日期),LawInfo(传球,最大日期),LawInfo(高尔夫,最大日期),LawInfo(篮球,最大日期)

LawInfo->LawInfo(足球,最大日期),LawInfo(传球,最大日期),LawInfo(高尔夫,最大日期),LawInfo(篮球,最大日期)

EN

回答 2

Stack Overflow用户

发布于 2016-07-07 20:55:46

您可以使用

代码语言:javascript
复制
Map<LawInfoType, List<LawInfo>> result = list.stream()
    .filter(l -> l.getState()==State.ready)
    .collect(
        Collectors.groupingBy(LawInfo::getTextType,
            Collectors.collectingAndThen(
                Collectors.groupingBy(LawInfo::getGame,
                    Collectors.maxBy(Comparator.comparing(LawInfo::getMinDate))),
                m -> m.values().stream().map(Optional::get).collect(Collectors.toList())
        )));

result.forEach((k,v) -> {
    System.out.println(k);
    v.forEach(l -> System.out.printf("%14s, %15tF%n", l.getGame(), l.getMinDate()));
});

它将打印

代码语言:javascript
复制
big
          golf, 250345012-06-20
    basketball,  53051589-05-19
      football, 177220545-11-30
         hokey, 277009605-05-01
middle
          golf,  24379695-11-03
    basketball, 283700233-08-25
      football, 248125707-04-08
         hokey, 195919793-04-22
small
          golf, 152237339-07-10
    basketball, 269880024-08-24
      football, 285393288-11-14
         hokey, 276036745-09-23

用你的测试数据。请注意,该范围中的日期值不太适合进行一致性检查,因为此数据集的其他日期在打印输出中看起来可能具有更高的数字,因为使用此格式打印的年份不是带符号的数字。我建议生成具有合理值的日期,例如,具有四位正数年份…

票数 3
EN

Stack Overflow用户

发布于 2016-07-07 19:12:31

您可以按两个属性(getTextType和getGame)和一个最大收集器进行分组。

如下所示:

代码语言:javascript
复制
Map<LawInfoType, Map<Game, Optional<LawInfo>>> map0 = list.stream().collect(
    Collectors.groupingBy(LawInfo::getTextType,
         Collectors.groupingBy(LawInfo::getGame,           
              Collectors.maxBy(Comparator.comparing(LawInfo::getMinDate))
    )));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38243829

复制
相关文章

相似问题

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