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
Java 8 Stream API toMap converting to TreeMap
提问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 groupingBy
method and pass TreeMap
as Supplier
:
您可以使用重载groupingBy
方法并传递TreeMap
为Supplier
:
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()));