【问题标题】:Is there a way to return comparator which wont do anything?有没有办法返回不会做任何事情的比较器?
【发布时间】:2017-06-09 07:53:32
【问题描述】:

我有两个类扩展了一个父类,并且有一种方法可以通过某个参数对数据进行排序。因此,对于这两个类中的一个,我需要应用一些排序,但对于另外两个不做任何事情。有这种可能吗?

public class MedicalCompositeRatesData{

  @Override
  public List<RateTableData> buildData(RateTableInputBean inputBean)
  {
    SGQuotingData sgQuotingData = inputBean.getQuotingData();

    List<ProductData> products = extractorFactory
      .getProductExtractor(inputBean.getPlanType(), inputBean.getRatingType())
      .extract(sgQuotingData);

    List<Row> rates = products.stream()
        .map(it -> buildRow(it, sgQuotingData))
        .sorted(getProductComparator())
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

    return buildRateTables(rates);
  }

  protected Comparator<Product> getProductComparator(){
    //should leave default sorting
  }

}

public class AlternateCompositeRatesBuilder extends MedicalCompositeRatesData
{

  protected Comparator<Product> getProductComparator(){
    //will sort by rate
  }

}

【问题讨论】:

  • 当然,不要在其他两个类中实现排序方法。把它放在你需要的课堂上。
  • 所以说“不实现排序”是指返回一些空比较器吗?
  • 这里不完全清楚你想要实现什么,可能是一个更简单的例子,我们可以看看?一个不做任何事情的比较器,你的意思是不会排序?如果是这样,可能只是一直在那个返回zero?从而使所有条目都相同
  • 不知何故,在您的父类中,您只需将 Comparator 函数设为空..并在需要它的孩子中实现它..我什至看不到它的用途父类,如果 3 个孩子中只有一个会使用它
  • 可能返回零应该可以。让我检查一下。

标签: java java-8 comparator


【解决方案1】:
如果流是有序的,

Stream.sort 会进行稳定 排序。换句话说,如果两个元素相等,那么它们将保持它们的初始顺序。

因此,由于您的流是由 List 组成的,您可以简单地使所有元素相等:

protected Comparator<Product> getProductComparator() {
    return (a1, a2) -> 0;
}

虽然看起来不是很酷,但它应该可以完成工作。

【讨论】:

  • 由于null 引用无论如何都会被过滤掉,.filter(Objects::nonNull).sorted(Comparator.nullsFirst(null)) 也将完成这项工作,因为它平等地对待所有非null 对象。请注意,排序前的过滤可能会减少排序的工作量……
  • 可能还值得注意的是,对parallel 流进行排序是not 始终稳定的(尽管应该如此)。
  • @StefanZobel 哦,我不知道...有趣 :) 任何委托给 Arrays.parallelSort 的东西都会受到影响(这通常是 AFAIK)
  • @RonanDhellemmes 是的。真正令人沮丧的是,这在 Java 9 中没有得到解决。
【解决方案2】:

如果你的类路径中有番石榴,你可以使用:

Ordering.allEqual();  

在内部做同样的事情返回零......

@Override
public int compare(@Nullable Object left, @Nullable Object right) {
  return 0;
}

【讨论】:

  • 您能否提供一些示例,说明如果我使用流,它将如何在我的情况下工作?
  • @user3298327 没关系...甚至番石榴都建议使用 lambda 表达式:Use the lambda expression (a, b) -&gt; 0 instead
  • @AlexMalinovskiy OrderingComparator 的子类。所以它也应该工作。它对您不起作用的原因是getProductComparator 的签名错误。应该是protected Comparator&lt;? super Product&gt; getProductComparator()
猜你喜欢
  • 2012-09-07
  • 2016-10-02
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多