【发布时间】:2015-03-02 16:12:05
【问题描述】:
假设我有以下地图:
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>)
【问题讨论】:
-
您确定要这个吗?这意味着只有一个
Message和一个特定的sendDate,即使存在具有相同日期但发送者和接收者不同的不同消息。 -
是的。基本上,我会收到给定成员发送或接收的最新消息。
-
我实际上是在实现一个消息框,例如 what'sapp 或 hangout 上的消息框等...
-
哦,我现在和你在一起!你是对的。让我编辑我的问题....
-
@Holger 我认为这与这个问题相同:stackoverflow.com/questions/28810301/… 我想出了一些办法;但也许你有更好的实现(起初我并不清楚这个问题)。 ;-)
标签: dictionary java-8 java-stream