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