将方法引用作为参数传递
Passing a method reference as parameter
在这种情况下:
public class Order {
List<Double> prices = List.of(1.00, 10.00, 100.00);
List<Double> pricesWithTax = List.of(1.22, 12.20, 120.00);
Double sumBy(/* method reference */) {
Double sum = 0.0;
for (Double price : /* method reference */) {
sum += price;
}
return sum;
}
public List<Double> getPrices() { return prices; }
public List<Double> getPricesWithTax() { return pricesWithTax; }
}
我如何声明 sumBy
方法可以像这样调用:
Order order = new Order();
var sum = order.sumBy(order::getPrices);
var sumWithTaxes = order.sumBy(order::getPricesWithTax);
我没有使用 Java 8 API 求和,因为我的目标只是了解如何传递方法引用。
你似乎想要一个Supplier
喜欢
Double sumBy(Supplier<List<Double>> f) {
Double sum = 0.0;
for (Double price : f.get()) {
sum += price;
}
return sum;
}
你的 List.of
语法给我错误。所以我做了
List<Double> prices = Arrays.asList(1.00, 10.00, 100.00);
List<Double> pricesWithTax = Arrays.asList(1.22, 12.20, 120.00);
然后我测试了一下
public static void main(String[] args) throws IOException {
Order order = new Order();
double sum = order.sumBy(order::getPrices);
double sumWithTaxes = order.sumBy(order::getPricesWithTax);
System.out.printf("%.2f %.2f%n", sum, sumWithTaxes);
}
产出
111.00 133.42
我认为 Supplier<T>
函数式界面就是您要找的:
Double sumBy(Supplier<Collection<Double>> supplier) {
Collection<Double> prices = supplier.get();
}
您的 2 个方法不带参数,return 一个对象,因此适合 Supplier.get()
方法。
不要将 Double
用于 sum
变量,因为那样会使 auto-box 和 auto-unbox 太多。
方法可以是 static
,因为它不使用 class 的任何字段或其他方法。
static double sumBy(Supplier<List<Double>> listGetter) {
double sum = 0.0;
for (double price : listGetter.get()) {
sum += price;
}
return sum;
}
更好的是:
static double sumBy(Supplier<List<Double>> listGetter) {
return listGetter.get().stream().mapToDouble(Double::doubleValue).sum();
}
使用Double sumBy(Supplier<List<Double>> doubles)
在这种情况下:
public class Order {
List<Double> prices = List.of(1.00, 10.00, 100.00);
List<Double> pricesWithTax = List.of(1.22, 12.20, 120.00);
Double sumBy(/* method reference */) {
Double sum = 0.0;
for (Double price : /* method reference */) {
sum += price;
}
return sum;
}
public List<Double> getPrices() { return prices; }
public List<Double> getPricesWithTax() { return pricesWithTax; }
}
我如何声明 sumBy
方法可以像这样调用:
Order order = new Order();
var sum = order.sumBy(order::getPrices);
var sumWithTaxes = order.sumBy(order::getPricesWithTax);
我没有使用 Java 8 API 求和,因为我的目标只是了解如何传递方法引用。
你似乎想要一个Supplier
喜欢
Double sumBy(Supplier<List<Double>> f) {
Double sum = 0.0;
for (Double price : f.get()) {
sum += price;
}
return sum;
}
你的 List.of
语法给我错误。所以我做了
List<Double> prices = Arrays.asList(1.00, 10.00, 100.00);
List<Double> pricesWithTax = Arrays.asList(1.22, 12.20, 120.00);
然后我测试了一下
public static void main(String[] args) throws IOException {
Order order = new Order();
double sum = order.sumBy(order::getPrices);
double sumWithTaxes = order.sumBy(order::getPricesWithTax);
System.out.printf("%.2f %.2f%n", sum, sumWithTaxes);
}
产出
111.00 133.42
我认为 Supplier<T>
函数式界面就是您要找的:
Double sumBy(Supplier<Collection<Double>> supplier) {
Collection<Double> prices = supplier.get();
}
您的 2 个方法不带参数,return 一个对象,因此适合 Supplier.get()
方法。
不要将 Double
用于 sum
变量,因为那样会使 auto-box 和 auto-unbox 太多。
方法可以是 static
,因为它不使用 class 的任何字段或其他方法。
static double sumBy(Supplier<List<Double>> listGetter) {
double sum = 0.0;
for (double price : listGetter.get()) {
sum += price;
}
return sum;
}
更好的是:
static double sumBy(Supplier<List<Double>> listGetter) {
return listGetter.get().stream().mapToDouble(Double::doubleValue).sum();
}
使用Double sumBy(Supplier<List<Double>> doubles)