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

时间:2018-07-20 02:39:47

标签: java java-8 comparator

假设我有一个ClassA类,并且它具有ClassB作为其属性:

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

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

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

3 个答案:

答案 0 :(得分:3)

您可以这样做

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

将比较的Function传递到Comparator,它将创建一个根据给定的stream排序的新Comparator。然后将其收集到List中。

如果要处理空值,可以按照以下步骤进行操作。

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

答案 1 :(得分:3)

只是普通的点符号...

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

...小心使用null。如果您的ClassA对象的classB属性为null,它将抛出NullPointerException。

答案 2 :(得分:0)

只需使用

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