我想通过也是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
。在Bar
为null
的情况下,应将Foo
移到列表的末尾。
您可以在第一种方法中简单地使用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())));