嵌套POJO的比较器

我想通过也是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应该移到列表的末尾。

ili21477 回答:嵌套POJO的比较器

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

 @FXML
    public TableView<Avatar> produits;

    @FXML
    public void initialize(){

        Task<ObservableList<Avatar>> task = new Task<ObservableList<Avatar>>() {
            @Override
            protected ObservableList<Avatar> call() throws Exception {
                return FXCollections.observableArrayList(CategorieTrait.getInstance().avatarList());
            }
        };


        produits.itemsProperty().bind(task.valueProperty());

        new Thread(task).start();
    }

当您希望使<TableView style="-fx-backround-color:#33d9b2;" fx:id="produits" prefWidth="900" prefHeight="600"> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/> </columnResizePolicy> <columns> <TableColumn text="Picture" style="-fx-backround-color:#33d9b2"> <cellValueFactory> <PropertyValueFactory property="image"/> </cellValueFactory> </TableColumn> </columns> </TableView> 具有可比性时,您应该这样做:

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

并通过

跟进
Bar
,

对于Comparator<T>,签名为:

static <T,U extends Comparable<? super U>> Comparator<T>
  comparing(Function<? super T,? extends U> keyExtractor)

因此,Foo::getBar的结果必须实现ComparableBar实现Comparator,而不是Comparable

Oracle的comparing​方法文档详细介绍了(强调我):

接受一个从类型T中提取 Comparable 排序键的函数。

本文链接:https://www.f2er.com/2752773.html

大家都在问