Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8流中按属性排序_Java_Sorting_Lambda_Java 8_Java Stream - Fatal编程技术网

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

哦,那些带有lambdas的棘手的Java8流。他们是非常强大的,但复杂的需要一点来包装一个人的头周围的一切

假设我有一个
User
类型,其属性为
User.getName()
。假设我有一个与名称(例如登录用户名)关联的那些用户的地图
map
。让我们进一步假设我有一个comparator
UserNameComparator.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));