3 回答
TA贡献1853条经验 获得超6个赞
您可以使用 aFunction转换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);
如果您的 getter 预计始终返回非 null,那么这ToDoubleFunction是一个更好的使用类型(但如果您的返回值可能为 null,则它将不起作用Double):
List<A> getTopItems(List<A> elements, ToDoubleFunction<A> mapper, int n) {
return elements.stream()
.sorted(Comparator.comparingDouble(mapper).reversed())
.limit(n)
.collect(Collectors.toList());
}
TA贡献1854条经验 获得超8个赞
您可以将字段名称传递给通用 getTopItems 函数并使用java.beans.PropertyDescriptor
List<A> getTopItemsByField(List<A> elements, String field) {
PropertyDescriptor pd = new PropertyDescriptor(field, A.class);
Method getter = pd.getReadMethod();
return elements.stream()
.filter(a -> getter(a) != null)
.sorted(Comparator.comparingDouble(a->a.getter(a)).reversed())
.limit(n)
.collect(Collectors.toList());
}
TA贡献1804条经验 获得超2个赞
我认为你可以更改函数名称并添加 if 条件:
List<A> getTopItems(List<A> elements, int n, String byWhat) {
if (byWhat.equals("Salary"))
return elements.stream()
.filter(a -> a.getSalary() != null)
.sorted(Comparator.comparingDouble(A::getSalary).reversed())
.limit(n)
.collect(Collectors.toList());
if (byWhat.equals("Height"))
return elements.stream()
.filter(a -> a.getHeight() != null)
.sorted(Comparator.comparingDouble(A::getHeight).reversed())
.limit(n)
.collect(Collectors.toList());
if (byWhat.equals("Age"))
return elements.stream()
.filter(a -> a.getAge() != null)
.sorted(Comparator.comparingDouble(A::getAge).reversed())
.limit(n)
.collect(Collectors.toList());
}
添加回答
举报