如何在groupingBy LawInfoType中找到所有游戏的最大LawInfo by date?
我有一个简单的模型:
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;
}主要测试
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)); //!!!????但我需要进入每组最大按日期分组按游戏
like this : Map<LawInfoType, List<LawInfo>> 小->LawInfo(足球,最大日期),LawInfo(传球,最大日期),LawInfo(高尔夫,最大日期),LawInfo(篮球,最大日期)
中间->LawInfo(足球,最大日期),LawInfo(传球,最大日期),LawInfo(高尔夫,最大日期),LawInfo(篮球,最大日期)
LawInfo->LawInfo(足球,最大日期),LawInfo(传球,最大日期),LawInfo(高尔夫,最大日期),LawInfo(篮球,最大日期)
发布于 2016-07-07 20:55:46
您可以使用
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()));
});它将打印
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用你的测试数据。请注意,该范围中的日期值不太适合进行一致性检查,因为此数据集的其他日期在打印输出中看起来可能具有更高的数字,因为使用此格式打印的年份不是带符号的数字。我建议生成具有合理值的日期,例如,具有四位正数年份…
发布于 2016-07-07 19:12:31
您可以按两个属性(getTextType和getGame)和一个最大收集器进行分组。
如下所示:
Map<LawInfoType, Map<Game, Optional<LawInfo>>> map0 = list.stream().collect(
Collectors.groupingBy(LawInfo::getTextType,
Collectors.groupingBy(LawInfo::getGame,
Collectors.maxBy(Comparator.comparing(LawInfo::getMinDate))
)));https://stackoverflow.com/questions/38243829
复制相似问题