Java 8 Stream API toMap 转换为 TreeMap

14
public class Message {
    private int id;
    private User sender;
    private User receiver;
    private String text;   
    private Date senddate;
..
}

我有

List<Message> list= new ArrayList<>();

我需要将它们转换成

TreeMap<User,List<Message>> map

我知道如何使用以下方法将其转换为HashMap

list.stream().collect(Collectors.groupingBy(Message::getSender));

但我需要 TreeMap,其中: Key - 用户按最新消息发送日期排名,先发最新的消息 Value - 按发送日期最新排序的列表

用户类的一部分

    public class User{
    ...
    private List<Message> sendMessages;
    ...

   public List<Message> getSendMessages() {
        return sendMessages;
    }

}

用户比较器:
     public class Usercomparator implements Comparator<User> {
        @Override
        public int compare(User o1, User o2) {
            return o2.getSendMessages().stream()
.map(message -> message.getSenddate())
.max(Date::compareTo).get()
           .compareTo(o1.getSendMessages().stream()
.map(message1 -> message1.getSenddate())
.max(Date::compareTo).get());
        }
    }

1
您计划使用类型为“User”的键。 这个类是否实现了“Comparable<User>”接口?如果没有,您想以何种方式进行比较? - Pshemo
2
你能发布一下你的“User”类吗?还有一个样例输入/输出吗? - Tunaki
我添加了User类的一部分和比较器。 - VoldemarP
1
另外,提供一个示例输入/输出,因为目前不清楚您想要做什么。请详细说明。 - Tunaki
顺便提一下:Comparator<Message> byDate=Comparator.comparing(Message::getSenddate); Comparator<User> userComparator=Comparator.comparing(user -> Collections.max(user.getSendMessages(), byDate), byDate);... - Holger
2个回答

36

您可以使用重载的groupingBy方法,并将TreeMap作为Supplier传递:

TreeMap<User, List<Message>> map = list
            .stream()
            .collect(Collectors.groupingBy(Message::getSender,
                    () -> new TreeMap<>(new Usercomparator()), toList()));

4
数值将不会被排序。 - Alexis C.

12
如果你的列表已经排序好了,那么可以使用这个代码来创建排序好的映射表。

如果您的列表已排序,则只需使用此代码创建排序映射表。

Map<String, List<WdHour>> pMonthlyDataMap = list
                .stream().collect(Collectors.groupingBy(WdHour::getName, TreeMap::new, Collectors.toList()));

2
这个解决方案将按名称排序给出地图,而不是按列表的排序顺序排序。 - Kashif Ibrahim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接