如何在Java中使用收集器聚合多个字段

Nic*_*k T 6 java java-stream collectors

我有一个自定义对象项,其中有两个字段金额和税额。我有一个Itemized对象的数组,并且我希望对同一流中的两个字段求和。下面是我如何计算两个字段的总和。

double totalAmount = Arrays.stream(getCharges()).map(Itemized::getAmount).reduce(0.0, Double::sum));
double totalTax = Arrays.stream(getCharges()).map(Itemized::getTax).reduce(0.0, Double::sum));
Run Code Online (Sandbox Code Playgroud)

我有什么办法不必解析两次流并且可以一次性将两个字段求和?我不希望对totalTax和totalAmount求和,但要分别求和。我当时在看收集器,但找不到任何可以一口气汇总多个字段的示例。

Mạn*_*yễn 0

您可以定义一个自定义对象来保存两个字段的总和值,而不是按字段求和:

ItemizedValues {
    private double amount;
    private double tax;

    public static final ItemizedValues EMPTY = new ItemizedValues(0, 0);

    // Constructor - getter - setter
    public static ItemizedValues of(Itemized item) {
         return new ItemizedValues(amount, tax);
    }

    public static ItemizedValues sum(ItemizedValues a, ItemizedValues b) {
         // Sum the fields respectively
         // It's your choice to reuse the existing instances, modify the values or create a brand new one
    }
}

Arrays.stream(getCharges())
      .map(ItemizedValues::of)
      .reduce(ItemizedValues.EMPTY, ItemizedValues::sum);
Run Code Online (Sandbox Code Playgroud)