如何使用Amount进行聚合(make in Group)枚举常量

时间:2015-10-16 08:00:07

标签: java

我有一个包含大量常量列表的枚举。我在这里显示两个常量数据。

public enum PaymentType implements BaseEnum{
CASH(1, "Cash", "PaymentType.cash"),
CREDIT(2, "Credit Card", "PaymentType.credit");

现在我有一个付款数组。付款阵列有PaymentTypes。所以我想尝试使用Amount聚合PaymentType。将PaymentType与金额分组。我使用下面的代码,它正在工作。但是我有一个很大的常量列表,所以我不想写硬编码。我们能否拥有一个可以聚合它们的逻辑。

for(Payment pay:payments){

        if(pay.getType().getCode() == PaymentType.CASH.getCode()){
            totalCash += payment.getAmount();
        } else
            if(pay.getType().getCode() == PaymentType.CREDIT.getCode()){
                totalCredit += payment.getAmount();
            }
    }   

输出: -

 Cash $500
 Credit $1000

由于

1 个答案:

答案 0 :(得分:0)

对于任意数量的分组,请使用TenantId。在您的情况下,密钥是枚举,因此请使用Map

我认为金额是EnumMap,因为BigDecimal对于货币值(精确/舍入问题)来说是一个糟糕的选择。

double

您现在可以获得任何枚举的总数:

EnumMap<PaymentType, BigDecimal> totals = new EnumMap<>(PaymentType.class);
for (Payment payment : payments) {
    BigDecimal total = totals.get(payment.getType());
    total = (total == null ? payment.getAmount() : total.add(payment.getAmount()));
    totals.put(payment.getType(), total);
}

如果未找到该类型的付款,则值为BigDecimal cashTotal = totals.get(PaymentType.CASH); 。如果您想要零值,请使用:

null

<强>更新

使用// Any Java version BigDecimal cashTotal = totals.get(PaymentType.CASH); if (cashTotal == null) cashTotal = BigDecimal.ZERO; // Java 8+ BigDecimal cashTotal = totals.getOrDefault(PaymentType.CASH, BigDecimal.ZERO); 非常相似:

double