这是一个 (原金额 - 优惠券 = 实付金额) 的一个接口:
原代码:
BigDecimal amount = new BigDecimal(computeAmtCardParam.getAmount());
BigDecimal vou = null;
boolean existed = amount.doubleValue() >= 0.00 && (MobileCardvouConstants.CASH_COUPON.equals(couponDef.getCouType()) || MobileCardvouConstants.DISCOUNT_COUPON.equals(couponDef.getCouType()));
if(existed){
if (MobileCardvouConstants.CASH_COUPON.equals(couponDef.getCouType())){
//Calculate the amount of cash coupons
vou = new BigDecimal(couponDef.getVouContent());
result.setPaymoney(amount.subtract(vou));
result.setOriginalAmt(amount);
result.setConsumeAmt(vou);
if(result.getPaymoney().compareTo(BigDecimal.valueOf(0.00)) < 0) {
result.setPaymoney(BigDecimal.valueOf(0.00));
}
}else if (MobileCardvouConstants.DISCOUNT_COUPON.equals(couponDef.getCouType())){
//Calculate the discount amount
vou = new BigDecimal(couponDef.getVouContent());
result.setPaymoney(amount.multiply(vou.multiply(BigDecimal.valueOf(0.1))));
result.setOriginalAmt(amount);
result.setConsumeAmt(result.getOriginalAmt().subtract(result.getPaymoney()));
if(result.getPaymoney().compareTo(BigDecimal.valueOf(0.00)) < 0) {
result.setPaymoney(BigDecimal.valueOf(0.00));
}
}
}else{
result.setPaymoney(amount);
result.setOriginalAmt(amount);
result.setConsumeAmt(BigDecimal.valueOf(0.00));
}
//Coupon calculation
result.setResultCode(MobileApiConstants.RESULT_CODE_SUCCESS);
return result;
原来的代码思路是:先判断金额以及优惠券类型是否存在,在这个判断的基础上再嵌套一层判断优惠券类型,然后根据优惠券的类型再给金额做出处理,最后将原金额,优惠券金额,实付金额输出。这里他的思路很直接,先判断金额是否大于0且是否存在指定的优惠券类型:不存在则将优惠券金额设置成0,然后将指定字段输出;存在则再判断一次类型,根据不同类型做金额处理最后将指定字段输出。这段代码个人觉得中规中矩,但是很多代码都是多余的,比如在计算金额后得到金额小于0则用0来表示,完全是没有必要写成两段话的,因此我对这段代码进行了一些优化。
然后下面是我对这段代码的优化:
BigDecimal amount = new BigDecimal(computeAmtCardParam.getAmount());
BigDecimal originalAmount = amount.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : amount;
BigDecimal vouContent = couponDef.getVouContent() == null ? BigDecimal.ZERO : new BigDecimal(couponDef.getVouContent());
BigDecimal payMoney = null;
if(MobileCardvouConstants.CASH_COUPON.equals(couponDef.getCouType())) {
payMoney = originalAmount.subtract(vouContent).compareTo(BigDecimal.valueOf(0.0)) < 0 ? BigDecimal.ZERO : originalAmount.subtract(vouContent);
}else if(MobileCardvouConstants.DISCOUNT_COUPON.equals(couponDef.getCouType())) {
payMoney = originalAmount.multiply(vouContent.multiply(BigDecimal.valueOf(0.1)));
}else {
payMoney = originalAmount;
}
result.setPaymoney(payMoney);
result.setConsumeAmt(vouContent);
result.setOriginalAmt(originalAmount);
result.setResultCode(MobileApiConstants.RESULT_CODE_SUCCESS);
return result;
这段代码中,我使用了两个三目运算,第一个三目运算就可以确定实际收款金额小于0后使用0代替,第二个三目运算符可以确定优惠的类型,并根据优惠类型来做出计算。这样的做法可以避免在判断中做出进一步的判断0的计算,然后通过不同的优惠券类型进行相应计算,这里只需要得到计算的结果后直接将数值传给结果Bean即可。