アリウス派:
すべてのdouble値を返すの異なる方法によって返された値に基づいて、クラスの選択上位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());
}
どのように私はこの方法で渡すことができますし、ただ一つの方法がありますか?
ernest_k:
あなたが使用できるFunction
ことを変換A
する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);
あなたのゲッターは常に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());
}