说我有以下地图:
Map<Member, List<Message>> messages = ... //constructed somehow
我想使用Java 8流api来获取:
SortedMap<Message, Member> latestMessages = ...
比较器传递到SortedMap / TreeMap的位置将基于消息sendDate字段。
此外,在已发送消息列表中,我将选择最新消息,该消息将成为已排序映射的关键。
我该如何实现?
编辑1:
Comparator<Message> bySendDate = Comparator.comparing(Message::getSendDate);
SortedMap<Message, Member> latestMessages = third.entrySet().stream()
.collect(Collectors.toMap(e -> e.getValue().stream().max(bySendDate).get(), Map.Entry::getKey, (x, y) -> {
throw new AssertionError();
}, () -> new TreeMap(bySendDate.thenComparing(Comparator.comparing(Message::getId)))));
我收到以下编译错误:
The method collect(Collector<? super T,A,R>) in the type Stream<T> is not applicable for the arguments (Collector<Map.Entry<Member,List<Message>>,?,TreeMap>)
让我们将其分解为两部分。
首先,转变Map<Member, List<Message>> messages
成Map<Message, Member> latestMessages
通过减少特定通信伙伴(消息Member
)最新:
Map<Message, Member> latestMessages0 = messages.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getValue().stream().max(Comparator.comparing(Message::getSendDate)).get(),
Map.Entry::getKey));
在这里,结果map
没有排序,但是每个映射都将包含与该参与者共享的最新消息。
其次,如果要按sendDate对结果映射进行排序,则必须添加另一个辅助排序条件,以避免丢失Messages
恰好具有相同日期的数据。假设您具有一个Long
唯一的ID,则将该ID添加为具有相同日期的邮件的辅助排序条件就足够了:
Comparator<Message> bySendDate=Comparator.comparing(Message::getSendDate);
SortedMap<Message, Member> latestMessages = messages.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getValue().stream().max(bySendDate).get(),
Map.Entry::getKey, (x,y) -> {throw new AssertionError();},
()->new TreeMap<>(bySendDate.thenComparing(Comparator.comparing(Message::getId)))));
由于按唯一ID排序可以解决任何歧义,因此我提供了一个合并函数,该函数将无条件抛出,因为永远不需要调用它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句