使用Java 8流API将地图转换为另一个地图

腰带

说我有以下地图:

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>> messagesMap<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java8:使用流将一个地图转换为另一个地图

使用Java 8流从另一个地图映射构建一个地图映射

Java:使用流将List <Object>转换为另一个List <anotherObject>

Java流:将一个对象的列表转换为另一个

使用Java将地图内容存储到另一个地图中

Java流-将流结果从一个对象转换为另一个

在Guava的帮助下使用另一个地图转换地图

使用流将列表转换为另一个列表

R 语言:使用 ggmap 将地图插入另一个地图

如何将一个POJO的列表转换地图<字符串,列表>在Java流?

在Java 8中,如何使用lambda将Map <K,V>转换为另一个Map <K,V>?

Java的8一个流多地图

如何使用高效的Java流将地图转换为CSV?

Java的8个流功能分组到地图,其中的值是一个地图

Java的8个流API:如何将列表转换为列表中的某个地图<龙,集>具有重复键?

在 Java Springboot 中使用另一个图像将文本转换为图像

使用地图将每隔一个字符转换为大写

Java 8 Streams:我如何流式传输另一个流,如何将代码转换成Java8流

如何在配对另一个地图时(使用流)同时迭代列表和集合

如何使用流将对象列表转换为另一个列表对象?

使用XSLT将一个JAXB对象转换为另一个

使用选定元素将一个 case 类转换为另一个

嵌入在另一个地图中的地图的 Java 初始化

使用java8将列表转换为地图

使用 Java8 将列表转换为地图

Java / Stream帮助:仅使用流将地图的嵌套列表转换为地图

如何使用OOP将$ db从另一个.php转换为另一个.php的类?

为什么该Java流的一个版本可以在静态地图上运行,而另一个版本却失败?

如何使用GSON一个JSON转换为Java对象时,我重写一个Java地图?