假设我有一个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 = Wed 12月13日13:31:45 EST 2017 2 = Wed Nov 15 13:31:45 EST等等到49。
所以,问题是:是否有可能使用Java 8流,如果是,那么如何。
提前致谢。
如果我没有弄错你正在寻找这样的东西(假设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())));
这里有一个简洁的方法(没有溪流):
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
地图,使得只有最后一个日期映射到给定数字。