使用比较器接口和 java 8 流进行排序

2022-09-01 23:11:12

父级是由子级继承的类。子级由孙子继承。每个类都包含子类的列表(即父类包含子类的列表,子类包含孙子类的列表)。每个类包含 50 个属性(attrib1-atrib50)。getChildList() 返回 arrayLibrary 类型对象的列表 Child getGrandChildList() 返回 arrayList 类型对象的数组列表

让结果集成为父项的列表

List<Parent> resultSet

现在我想根据一些属性对列表进行排序。例如,如果我想根据两个父属性(比如属性 1 和属性 2)对 resultSet 进行排序,我将使用此代码。

Comparator<Parent> byFirst = (e1, e2) -> e2.getAttrib1().compareTo(e1.getAttrib1());
Comparator<Parent> bySecond = (e1, e2) -> e1.getAttrib2().compareTo(e2.getAttrib2());

Comparator<Parent> byThird = byFirst.thenComparing(bySecond);


List<Parent> sortedList = resultSet.stream().sorted(byThird).collect(Collectors.toList());

现在我想根据子类的属性 1 和孙子类的属性 1 对父列表进行排序。我应该如何排序。


答案 1

用于制作比较器。只要弄清楚你想比较什么。它看起来像这样,除了您将编写要用于提取要比较的值的任何逻辑:Comparator.comparing

Comparator<Parent> byAttr1ofFirstChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getAttr1()
);

Comparator<Parent> byAttr1ofFirstGrandChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getGrandChildren().get(0).getAttr1()
);


List<Parent> sortedList = parents.stream()
    .sorted(byAttr1ofFirstChild.thenComparing(byAttr1ofFirstGrandChild))
    .collect(toList());

Comparator.comparing也会使你的问题中的例子更好(使用静态导入):

Comparator<Parent> byFirst = comparing(Parent::getAttrib1, reverseOrder());
Comparator<Parent> bySecond = comparing(Parent::getAttrib2);

答案 2

推荐