有没有办法让比较器不做任何事情?

Ale*_*lex 5 java comparator java-8

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

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
  }

}
Run Code Online (Sandbox Code Playgroud)

小智 8

Stream.sort如果订购流,则进行稳定排序.换句话说,如果两个元素相等,那么它们将保持其初始排序.

因此,当您的流由a制作时List,您可以简单地使所有元素相等:

protected Comparator<Product> getProductComparator() {
    return (a1, a2) -> 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这看起来不是很酷,但它应该做的工作.

  • 由于`null`引用无论如何都被过滤掉了,`.filter(Objects :: nonNull).sorted(Comparator.nullsFirst(null))`也可以完成这项工作,因为它会同等地处理所有非`null`对象.请注意,排序前过滤可能会减少排序工作量... (4认同)
  • 可能还值得注意的是,排序"并行"流是[不](https://bugs.openjdk.java.net/browse/JDK-8076446)始终稳定(尽管它应该是). (3认同)