Comparator#comparing 按class属性的属性排序

Comparator#comparing sort by the attribute of the class attribute

假设我有一个 class ClassA,它的属性是 ClassB:

public ClassA
{
    private String attr;
    private ClassB classB;
}

public ClassB
{
    private String attr1;
    private int attr2;
}

根据上面的class,是否可以使用Comparator按ClassB 的属性对ClassA List<ClassA> list 的列表进行排序?它可以通过代码 Comparator.comparing(ClassA::getAttr) 轻松地按 ClassA 属性排序,但是如果我想按 ClassB 中的属性对列表进行排序,比如说 attr2 属性怎么办?

你可以这样做,

List<ClassA> sortedList = list.stream()
    .sorted(Comparator.comparing(a -> a.getClassB().getAttr2()))
    .collect(Collectors.toList());

将比较 Function 传递给 Comparator,它将创建一个根据给定 Comparator 排序的新 stream。然后收藏成一个List.

如果你想处理空值,可以像下面那样完成。

final List<ClassA> sortedList = list.stream()
    .sorted(Comparator.nullsFirst(
        Comparator.comparing(a -> a.getClassB().getAttr1(), Comparator.nullsLast(String::compareTo))))
    .collect(Collectors.toList());

只是普通的点符号...

comparing(item -> item.getClassB().getAttr2());

...请注意空值。如果您的 ClassA 对象的 classB 属性为 null,它将抛出 NullPointerException。

只需使用

Comparator.comparing(item -> item.getClassB().getAttr2())