【问题标题】:Sorting using Comparator Interface and java 8 Streams使用 Comparator Interface 和 java 8 Streams 进行排序
【发布时间】:2015-07-09 22:35:59
【问题描述】:

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

设 resultSet 为父列表

List<Parent> resultSet

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

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 对 parentlist 进行排序。我应该如何排序。

【问题讨论】:

  • 如果每个Parent 中有很多Child,你如何按Child 的属性对Parent 的列表进行排序?您将使用列表中的哪个孩子来获取要比较的属性?
  • 通过 getChildList() 我获得了 Child 的访问权限,我将选择一个子属性。
  • 那么如果父母有 10 个孩子,他们的 attr1 值都不同,你会使用哪一个?

标签: java sorting java-8 comparator java-stream


【解决方案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);

【讨论】:

  • reverseOrder() :- 我无法在我的 IDE 中识别此方法
  • Comparator.reverseOrder(),但是使用静态导入让代码更简洁
  • 或者你可以做comparing(Parent::getAttrib1).reversed();
  • @AlexisC。可悲的是,comparing(...).reversed() 仅适用于方法引用形式的密钥提取器。如果你试图做comparing(parent-&gt;parent.getAttrib1()).reversed(),编译器不会在没有parent 变量的类型提示的情况下接受它。另一方面,comparing(parent-&gt;parent.getAttrb1(), reverseOrder()) 可以正常工作。
  • @Misha 是的,我知道。我希望将来会对此进行改进,以使这种结构能够正常工作:-)
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多