在 Java 8 流中按属性排序 [英] Sorting by property in Java 8 stream

查看:35
本文介绍了在 Java 8 流中按属性排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

哦,那些带有 lambda 表达式的棘手的 Java 8 流.它们非常强大,但复杂的东西需要一点时间才能将其全部包裹起来.

假设我有一个带有 User.getName() 属性的 User 类型.假设我有这些用户的地图 Map 与名称(例如,登录用户名)相关联.让我们进一步说,我有一个比较器的实例 UserNameComparator.INSTANCE 来对用户名进行排序(也许有花哨的校对器之类的).

那么如何获取地图中按用户名排序的用户列表?我可以忽略地图键并执行以下操作:

返回 userMap.values().溪流().sorted((u1, u2) -> {返回 UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName());}).collect(Collectors.toList());

但是我必须提取名称以使用 UserNameComparator.INSTANCE 的那一行似乎手动工作太多.有什么办法可以简单地提供 User::getName 作为某种映射函数,仅用于排序,并且仍然将 User 实例放回收集列表中?

奖励:如果我想排序的东西有两层深,比如User.getProfile().getUsername()怎么办?

解决方案

你想要的是 Comparator#comparing:

userMap.values().stream().sorted(Comparator.comparing(User::getName, UserNameComparator.INSTANCE)).collect(Collectors.toList());

对于问题的第二部分,您只需使用

Comparator.comparing(u->u.getProfile().getUsername(),UserNameComparator.INSTANCE)

Oh, those tricky Java 8 streams with lambdas. They are very powerful, yet the intricacies take a bit to wrap one's header around it all.

Let's say I have a User type with a property User.getName(). Let's say I have a map of those users Map<String, User> associated with names (login usernames, for example). Let's further say I have an instance of a comparator UserNameComparator.INSTANCE to sort usernames (perhaps with fancy collators and such).

So how do I get a list of the users in the map, sorted by username? I can ignore the map keys and do this:

return userMap.values()
    .stream()
    .sorted((u1, u2) -> {
      return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName());
    })
    .collect(Collectors.toList());

But that line where I have to extract the name to use the UserNameComparator.INSTANCE seems like too much manual work. Is there any way I can simply supply User::getName as some mapping function, just for the sorting, and still get the User instances back in the collected list?

Bonus: What if the thing I wanted to sort on were two levels deep, such as User.getProfile().getUsername()?

解决方案

What you want is Comparator#comparing:

userMap.values().stream()
    .sorted(Comparator.comparing(User::getName, UserNameComparator.INSTANCE))
    .collect(Collectors.toList());

For the second part of your question, you would just use

Comparator.comparing(
    u->u.getProfile().getUsername(), 
    UserNameComparator.INSTANCE
)

这篇关于在 Java 8 流中按属性排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆