使用 Comparator.comparing 按对象列表对对象进行排序,然后按第二个 属性

Using Comparator.comparing for sorting an object by a list of objects and then by a second property

我最初按对象的属性对列表进行排序(假设 User 按其 firstName):

Collections.sort(userList, (u1, u2) -> (u1.getFirstName()).compareTo(u2.getFirstName()));

我可以替换为:

Collections.sort(userList, Comparator.comparing(User::getFirstName));

但是现在 User 有一个 Roles 的列表,每个角色都有一个 roleName,我想要按 UserRoleroleName 对列表进行排序。我想到了这个:

Collections.sort(userList, (u1, u2) -> (u1.getUserRoles().get(0).getRoleName()).compareTo(u2.getUserRoles().get(0).getRoleName()));

这似乎工作正常。

在IDE中,现在有消息:可以用Comparator.comparing替换...,但我不知道具体如何做这个。这可能吗?这样的东西不起作用:

Collections.sort(userList, Comparator.comparing(User::getUserRoles.get(0).getRoleName());

如何使用 Comparator.comparing 对它进行排序?

在按 roleName 排序后,如何按 firstName 排序为第二个 属性?

在这种情况下不能使用方法引用,但可以使用 lambda 表达式:

Collections.sort(userList, Comparator.comparing(u -> u.getUserRoles().get(0).getRoleName()));

按两个属性排序:

Collections.sort(userList, Comparator.comparing((Function<User,String>)u -> u.getUserRoles().get(0).getRoleName())
                                     .thenComparing(User::getFirstName));

Collections.sort(userList, Comparator.comparing((User u) -> u.getUserRoles().get(0).getRoleName())
                                     .thenComparing(User::getFirstName));