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

令resultSet为父级列表

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

现在,我想基于Child类的属性1和GrandChild类的属性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);

07-25 22:46