Java8流API toMap转换为TreeMap

Java8流API toMap转换为TreeMap,java,lambda,java-8,java-stream,collectors,Java,Lambda,Java 8,Java Stream,Collectors,我有 public class Message { private int id; private User sender; private User receiver; private String text; private Date senddate; .. } 但我需要一个树形图,上面有: 密钥-先发送最新消息senddate的用户 值-按senddate排序的列表 用户类的一部分 list.stream().collect(Collect

我有

public class Message {
    private int id;
    private User sender;
    private User receiver;
    private String text;   
    private Date senddate;
..
}
但我需要一个树形图,上面有: 密钥-先发送最新消息senddate的用户 值-按senddate排序的列表

用户类的一部分

list.stream().collect(Collectors.groupingBy(Message::getSender));
公共类用户{
...
私人列表发送消息;
...
公共列表getSendMessages(){
返回发送消息;
}
}
用户比较器:

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

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

}
公共类Usercomparator实现Comparator{
@凌驾
公共整数比较(用户o1、用户o2){
返回o2.getSendMessages().stream()
.map(消息->消息.getSenddate())
.max(日期::compareTo).get()
.compareTo(o1.getSendMessages().stream())
.map(message1->message1.getSenddate())
.max(日期::compareTo).get();
}
}
您可以使用重载方法并将
TreeMap
传递为:

TreeMap map=list
.stream()
.collect(收集器.groupingBy)(消息::getSender,
()->新树映射(newusercomparator()),toList());

如果列表已排序,则只需将此代码用于已排序的地图

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

您计划使用
User
类型的密钥。该类是否实现了
可比性
?如果不是,你想如何比较它们?你能发布你的
User
类吗?还有一个示例输入/输出?我添加了用户类的一部分和compatarolso,一个示例输入/输出,因为不清楚您想在这里做什么。请展开。作为旁注:
comparatorbydate=Comparator.comparating(Message::getSenddate);Comparator userComparator=Comparator.Comparating(用户->集合.max(用户.getSendMessages(),byDate),byDate)…这些值不会被排序。谢谢。它工作得很好。这正是我需要的。此解决方案将为您提供按名称排序的地图,而不是按列表的排序顺序。
    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());
        }
    }
TreeMap<User, List<Message>> map = list
            .stream()
            .collect(Collectors.groupingBy(Message::getSender,
                    () -> new TreeMap<>(new Usercomparator()), toList()));
Map<String, List<WdHour>> pMonthlyDataMap = list
                .stream().collect(Collectors.groupingBy(WdHour::getName, TreeMap::new, Collectors.toList()));