gpt4 book ai didi

java - 来自嵌套 POJO 的比较器

转载 作者:行者123 更新时间:2023-12-01 01:39:21 24 4
gpt4 key购买 nike

我想根据也是 POJO 的属性对我的 POJO 列表进行排序。比较器应该移动 null值到列表的末尾。 null s 已经处于第二个 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())));

但这给了我编译错误:

The method comparing(Function, Comparator) in the type Comparator is not applicable for the arguments (Foo::getBar, Comparator>>)

还有

The type Foo does not define getBar(T) that is applicable here

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


编辑:

我刚刚意识到缺少一个关键部分。

在列表中,Foo s 永远不会 null ,但是Bar可能是 null .如果Barnull , Foo应该移到列表的末尾。

最佳答案

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

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

当您希望使 Bar 具有可比性时,您应该:

@Getter
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())));

关于java - 来自嵌套 POJO 的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59787013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com