Java 8 Stream API toMap 转换为 TreeMap

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35116264/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 23:45:24  来源:igfitidea点击:

Java 8 Stream API toMap converting to TreeMap

javalambdajava-8java-streamcollectors

提问by VoldemarP

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

I have

我有

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

I need to transform them to

我需要将它们转换为

TreeMap<User,List<Message>> map

I know how to do transform to HashMap using

我知道如何使用

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

But I need TreeMap with: Key - User with newest message senddate first Value - List sorted by senddate newest first

但我需要 TreeMap 与: Key - User with newest message senddate first Value - List 按 senddate newest first 排序

Part of User class

用户类的一部分

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

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

}

User comparator:

用户比较器:

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

回答by Mrinal

You can use overloaded groupingBymethod and pass TreeMapas Supplier:

您可以使用重载groupingBy方法并传递TreeMapSupplier

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

回答by fjkjava

If your list is sorted then just use this code for sorted map.

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

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