嵌套POJO的比较器

问题描述 投票:1回答:1

我想通过也是POJO的属性对POJO列表进行排序。比较器应将null值移到列表的末尾。 null已处于第二POJO级别。

假设以下POJO:

public class Foo {
    private Bar bar;
    private boolean set;
    // getter and setter omitted
}

public class Bar {
    private String name1;
    private String name2;
    // getter and setter omitted
}

现在我有一个List<Foo>,应该按Bar#name1排序。

到目前为止,我有以下代码:

Collections.sort(fullList, Comparator.comparing(Foo::getBar::getName1,
        Comparator.nullsLast(Comparator.naturalOrder())));

可悲的是,它不起作用,因为::运算符无法链接。所以我更新了Bar类以实现Comparator<Bar>

public class Bar implements Comparator<Bar> {
    private String name1;
    private String name2;
    // getter and setter omitted

    @Override
    public int compare(Bar o1, Bar o2) {
        return o1.getName1().compareTo(o2.getName1());
    }
}

并将我的排序代码更改为:

Collections.sort(fullList, Comparator.comparing(Foo::getBar,
        Comparator.nullsLast(Comparator.naturalOrder())));

但是这给了我编译错误:

Comparator类型中的compareing(Function,Comparator)方法不适用于参数(Foo :: getBar,Comparator >>)

以及

类型Foo没有定义适用于此的getBar(T)

第二部分我做错了什么?我该如何解决?


编辑:

我刚刚意识到一个关键部分丢失了。

在列表中,Foo从不为null,但Bar可能为null。在Barnull的情况下,应将Foo移到列表的末尾。

java java-8 comparator comparable
1个回答
0
投票

您可以在第一种方法中简单地使用lambda:

fooList.sort(Comparator.comparing(f -> f.getBar().getName1(),
            Comparator.nullsLast(Comparator.naturalOrder())))

[您希望使Bar具有可比性时,您应该这样做:

@Getter
static class Bar implements Comparable<Bar> {
    private String name1;
    private String name2;

    @Override
    public int compareTo(Bar o) {
        return name1.compareTo(o.getName1());
    }
} 

并通过]进行跟进>

fooList.sort(Comparator.comparing(Foo::getBar,
        Comparator.nullsLast(Comparator.naturalOrder())));
© www.soinside.com 2019 - 2024. All rights reserved.