問題

我有一堆方法基本上做同樣的事情:根據不同方法返回的值選擇類的頂部N例項,所有返回雙值.

例如,對於實現以下介面的類的物件:

 interface A {
    Double getSalary();
    Double getAge();
    Double getHeight();
}
 

我想選擇每個方法返回的值最高的N物件.

現在我有3種方法:

 List<A> getTopItemsBySalary(List<A> elements);
List<A> getTopItemsByAge(List<A> elements);
List<A> getTopItemsByHeight(List<A> elements);
 

這個機構:

 List<A> getTopItemsBySalary(List<A> elements, int n) {
    return elements.stream()
              .filter(a -> a.getSalary() != null)                 
              .sorted(Comparator.comparingDouble(A::getSalary).reversed())
              .limit(n)
              .collect(Collectors.toList());
}
 

如何傳遞方法,只有一個方法?

  最佳答案

您可以使用FunctionA轉換為Double,如:

 List<A> getTopItems(List<A> elements, Function<A, Double> mapper, int n) {
    return elements.stream()
              .filter(a -> null != mapper.apply(a))                 
              .sorted(Comparator.<A>comparingDouble(a -> mapper.apply(a))
                      .reversed())
              .limit(n)
              .collect(Collectors.toList());
}
 

您可以使用以下方法呼叫它:

 List<A> top10BySalary = getTopItems(list, A::getSalary, 10);
List<A> top10ByAge = getTopItems(list, A::getAge, 10);
 

如果您的getter總是返回非non-null,那麼ToDoubleFunction是一個更好的型別(但如果您的Double返回值可能為null,它將不起作用):

 List<A> getTopItems(List<A> elements, ToDoubleFunction<A> mapper, int n) {
    return elements.stream()
              .sorted(Comparator.comparingDouble(mapper).reversed())
              .limit(n)
              .collect(Collectors.toList());
}
 

  相同標籤的其他問題

java