Java 8 Stream API toMap 转换为 TreeMap

标签 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;
..
}

我有

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

我需要将它们转换成

TreeMap<User,List<Message>> map

我知道如何使用 HashMap 转换

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

但我需要 TreeMap : key - 最先发送最新消息的用户 值 - 按发送日期最新排序的列表

部分用户类

    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());
        }
    }

最佳答案

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

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

关于Java 8 Stream API toMap 转换为 TreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35116264/

相关文章:

java - java.awt.EventQueue.getCurrentEventImpl 中的 NullPointerException

java - Java-8 的 DoubleStream.sum() 方法在并行运行时是否稳定?

autocomplete - ReSharper在lambda表达式中具有匿名类型的自动完成行为

java - 使用泛型和 lambda 重载方法时调用方法不明确

java - libgdx 用户数据类

java - 设置按钮模型使复选框不可操作

Java 8 lambda null 检查用法

java - 具有自定义模式的 JDK8 java.time.LocalTime

Java 用线程对单词数组进行排序

java - 从观察者调用方法