如何使用 BigDecimals 避免巨大的 if 条件?
How to avoid of huge if condition using BigDecimals?
我在银行机构工作,我需要执行存款、取款、转账等交易。当我们考虑具有大值的字段时,我看到通常使用 BigDecimal 和 Java 8 在 Spring 引导应用程序中。
当我必须比较该数字 (BigDecimal) 是大于还是小于其他数字时,我了解到我们需要使用 compareTo() 方法。在我的示例中,我需要对两个值求和并将结果与第三个数字进行比较,正如我在以下示例中共享的那样,使用 Java 8 和 BigDecimal:
if ((request.getTransactionValue().add(BigDecimal.valueOf(totalTransactionValuePerDay))).compareTo(accountBank.getWithdrawLimitPerDay())
> 0) {
throw new UnprocessableEntityException("Withdraw limit per day has exceeded");
}
但是考虑到干净、可维护和可理解的代码,有人可以分享一个更好的方法,例如简洁的 and/or 智能解决方案吗?
检查客户是否达到交易银行每日提款限额的验证。我想知道如何在没有这个巨大 if 条件的情况下使用 Java 8 或 11 来处理 BigDecimal。
另一种方法可能是使用冗长的代码,但在此之前我希望找到更好的代码或获得帮助。
欢迎查看我的完整代码here。
不幸的是,Java 不支持适合 BigDecimal
和 BigInteger
类 的运算符重载(它作为 [=13 的语法糖实现) =] 使用 +
).
连接
避免如此长的条件的唯一方法是将其拆分为变量(也可能拆分为方法或 类)。对于这种特殊情况:
BigDecimal increment = BigDecimal.valueOf(totalTransactionValuePerDay);
BigDecimal transactionValue = request.getTransactionValue();
BigDecimal withdrawLimitPerDay = accountBank.getWithdrawLimitPerDay();
if (transactionValue.add(increment).compareTo(withdrawLimitPerDay) > 0) {
throw new UnprocessableEntityException("Withdraw limit per day has exceeded");
}
条件可能对您来说现在看起来更长了(只有 3 个变量!在手)。但是当你想添加 n BigDecimals 并将它们与你的数据进行比较时,它肯定会变大。
正如 Nikolas 已经回答的那样,一种直接的直觉是将它们移动到单独的方法中,在那里执行操作,然后 return 将所需的值返回给调用者。
其他非常简单的实现是使用 reduce 操作,如下所示(特别方便添加多个值,IMO 的可读性也更好),
BigDecimal bigDecimal1 = new BigDecimal(1);
BigDecimal data = new BigDecimal(3);
Stream.of(bigDecimal1, BigDecimal.valueOf(2)) // Can be generalised/refactored as a Function<Stream<BigDecimal>, BigDecimal>
.reduce(BigDecimal.ZERO, BigDecimal::add) // Identity for sum, and Accumulator.
.compareTo(data));
我在银行机构工作,我需要执行存款、取款、转账等交易。当我们考虑具有大值的字段时,我看到通常使用 BigDecimal 和 Java 8 在 Spring 引导应用程序中。
当我必须比较该数字 (BigDecimal) 是大于还是小于其他数字时,我了解到我们需要使用 compareTo() 方法。在我的示例中,我需要对两个值求和并将结果与第三个数字进行比较,正如我在以下示例中共享的那样,使用 Java 8 和 BigDecimal:
if ((request.getTransactionValue().add(BigDecimal.valueOf(totalTransactionValuePerDay))).compareTo(accountBank.getWithdrawLimitPerDay())
> 0) {
throw new UnprocessableEntityException("Withdraw limit per day has exceeded");
}
但是考虑到干净、可维护和可理解的代码,有人可以分享一个更好的方法,例如简洁的 and/or 智能解决方案吗?
检查客户是否达到交易银行每日提款限额的验证。我想知道如何在没有这个巨大 if 条件的情况下使用 Java 8 或 11 来处理 BigDecimal。
另一种方法可能是使用冗长的代码,但在此之前我希望找到更好的代码或获得帮助。
欢迎查看我的完整代码here。
不幸的是,Java 不支持适合 BigDecimal
和 BigInteger
类 的运算符重载(它作为 [=13 的语法糖实现) =] 使用 +
).
避免如此长的条件的唯一方法是将其拆分为变量(也可能拆分为方法或 类)。对于这种特殊情况:
BigDecimal increment = BigDecimal.valueOf(totalTransactionValuePerDay);
BigDecimal transactionValue = request.getTransactionValue();
BigDecimal withdrawLimitPerDay = accountBank.getWithdrawLimitPerDay();
if (transactionValue.add(increment).compareTo(withdrawLimitPerDay) > 0) {
throw new UnprocessableEntityException("Withdraw limit per day has exceeded");
}
条件可能对您来说现在看起来更长了(只有 3 个变量!在手)。但是当你想添加 n BigDecimals 并将它们与你的数据进行比较时,它肯定会变大。
正如 Nikolas 已经回答的那样,一种直接的直觉是将它们移动到单独的方法中,在那里执行操作,然后 return 将所需的值返回给调用者。
其他非常简单的实现是使用 reduce 操作,如下所示(特别方便添加多个值,IMO 的可读性也更好),
BigDecimal bigDecimal1 = new BigDecimal(1);
BigDecimal data = new BigDecimal(3);
Stream.of(bigDecimal1, BigDecimal.valueOf(2)) // Can be generalised/refactored as a Function<Stream<BigDecimal>, BigDecimal>
.reduce(BigDecimal.ZERO, BigDecimal::add) // Identity for sum, and Accumulator.
.compareTo(data));