Java8流中按属性排序
哦,那些带有lambdas的棘手的Java8流。他们是非常强大的,但复杂的需要一点来包装一个人的头周围的一切 假设我有一个Java8流中按属性排序,java,sorting,lambda,java-8,java-stream,Java,Sorting,Lambda,Java 8,Java Stream,哦,那些带有lambdas的棘手的Java8流。他们是非常强大的,但复杂的需要一点来包装一个人的头周围的一切 假设我有一个User类型,其属性为User.getName()。假设我有一个与名称(例如登录用户名)关联的那些用户的地图map。让我们进一步假设我有一个comparatorUserNameComparator.instance的实例来对用户名进行排序(可能有花哨的collator之类的) 那么如何获得地图中按用户名排序的用户列表呢?我可以忽略贴图键并执行以下操作: return user
User
类型,其属性为User.getName()
。假设我有一个与名称(例如登录用户名)关联的那些用户的地图map
。让我们进一步假设我有一个comparatorUserNameComparator.instance
的实例来对用户名进行排序(可能有花哨的collator之类的)
那么如何获得地图中按用户名排序的用户列表呢?我可以忽略贴图键并执行以下操作:
return userMap.values()
.stream()
.sorted((u1, u2) -> {
return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName());
})
.collect(Collectors.toList());
但是我必须提取名称以使用UserNameComparator.INSTANCE
的那一行似乎太多手工工作了。是否有任何方法可以简单地提供User::getName
作为一些映射函数,仅用于排序,并且仍然可以将User
实例返回到收集的列表中
额外好处:如果我想要排序的东西有两个层次,比如User.getProfile().getUsername()
?您想要的是:
对于问题的第二部分,您只需使用
Comparator.comparing(
u->u.getProfile().getUsername(),
UserNameComparator.INSTANCE
)
对于第二级中的比较,您可以这样进行: 对于对象
public class ArticleChannel {
private Long id;
private String label;
private ArticleBusiness business;
}
public class ArticleBusiness {
private Long id;
private String name;
}
articleChannelList.sort(Comparator.comparing((ArticleChannel articleChannel) -> **articleChannel.getBusiness().getName()**).thenComparing(ArticleChannel::getLabel));
哇,我的大脑几乎要痛了,但这正是我想要的,奖金和一切!而且反应也非常快。谢谢对于追随者,如果不需要特殊的comparator,还可以使用
comparator.comparing(o->o.getUsername())
或comparator.Comparating(UsernameComarator.INSTANCE)
,如果它可以接受用户而不是名称。不管好坏
public class ArticleChannel {
private Long id;
private String label;
private ArticleBusiness business;
}
public class ArticleBusiness {
private Long id;
private String name;
}
articleChannelList.sort(Comparator.comparing((ArticleChannel articleChannel) -> **articleChannel.getBusiness().getName()**).thenComparing(ArticleChannel::getLabel));