Есть ли способ вернуть компаратор, который ничего не делает?


У меня есть два класса, расширяющие один родительский класс, и есть метод, который сортирует данные по некоторому параметру. Поэтому для одного из этих двух классов мне нужно применить некоторую сортировку, но для двух других ничего не делать. Есть ли такая возможность?

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
  }

}
2 4

2 ответа:

Stream.sort делает стабильную сортировку, если поток упорядочен. Другими словами, если два элемента равны, то они сохранят свой первоначальный порядок.

Таким образом, поскольку ваш поток состоит из List, Вы можете просто сделать все элементы равными:

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

Это не очень круто выглядит, но это должно делать свою работу.

Если у вас есть гуава на пути к классу, вы можете использовать:

Ordering.allEqual();  

Что внутренне делает то же самое, возвращая ноль...

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