假设我有一个Map<Date, List<Integer>>
,其中整数列表只是彩票抽奖中的数字列表。它可能看起来像这样:
Wed Nov 15 13:31:45 EST 2017=[1, 2, 3, 4, 5, 6],
Wed Nov 22 13:31:45 EST 2017=[7, 8, 9, 10, 11, 12],
Wed Nov 29 13:31:45 EST 2017=[13, 14, 15, 16, 17, 18],
Wed Dec 13 13:31:45 EST 2017=[1, 19, 20, 21, 22, 23],
Wed Dec 20 13:31:45 EST 2017=[24, 25, 26, 27, 28, 29]
我需要将该地图转换为地图,其中key是彩票号码,值是投掷数字的最后日期。就像是: 1 = 2017年12月13日星期三13:31:45 2017 2 = 11月15日星期三美国东部时间2017年13:31:45 等到49岁。
所以,问题是:是否有可能使用Java 8流,如果是,那么如何。
提前致谢。
答案 0 :(得分:3)
如果我没有记错,你正在寻找类似的东西(假设Date
是Comparable
):
map.entrySet()
.stream()
.flatMap(x -> x.getValue().stream().map(y -> new AbstractMap.SimpleEntry<>(x.getKey(), y)))
.collect(Collectors.groupingBy(
Entry::getValue,
Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(Entry::getKey)),
x -> x.get().getKey())));
答案 1 :(得分:1)
这是一种简洁的方法(尽管没有溪流):
Map<Integer, Date> result = new HashMap<>();
map.forEach((date, list) -> list.forEach(n -> result.merge(n, date,
(oldDate, newDate) -> newDate.after(oldDate) ? newDate : oldDate)));
这会迭代map
地图,并且对于每个(date, list)
对,它会迭代list
数字列表。然后,它使用Map.merge
和Date.after
方法将条目放入result
地图,以便只将最后一个日期映射到给定数字。