奖励:如果我想排序的东西有两层深,比如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 useComparator.comparing( u->u.getProfile().getUsername(), UserNameComparator.INSTANCE) 这篇关于在 Java 8 流中按属性排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云! 08-14 11:05