使用Comparator接口和java 8 Streams进行排序

Parent是Child继承的类.这是由GrandChild继承的.每个类包含子类的List(即Parent包含Child和Child的List包含GrandChild的List).每个类包含50个属性(attrib1-atrib50).
getChildList()返回类型为Child的对象的arrayList getGrandChildList()返回GrandChild类型的对象的arrayList

设resultSet为Parent列表

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);
上一篇:java – 如何使用Collections和Comparator按升序对ArrayList进行排序


下一篇:一个注意点和技巧,promise.all