Sorting by property in Java 8 stream
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
)
Garret Wilson
Updated on July 08, 2022Comments
-
Garret Wilson almost 2 years
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 propertyUser.getName()
. Let's say I have a map of those usersMap<String, User>
associated with names (login usernames, for example). Let's further say I have an instance of a comparatorUserNameComparator.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 supplyUser::getName
as some mapping function, just for the sorting, and still get theUser
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()
?