Есть ли способ оптимизировать код ниже:
public BigDecimal calculate(Policy policy) {
BigDecimal total = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_EVEN);
for (PolicyObject policyObject : policy.getPolicyObjects()) {
for (PolicySubObject policySubObject : policyObject.getPolicySubObjects()) {
for (Risk risk : policySubObject.getRisks()) {
for (Rate rate : risk.getRates()) {
// CompareTo returns -1 if BigDecimal is smaller then to compared Big decimal
// 0 if equals and 1 if greater.
if (policySubObject.getSumInsured().compareTo(rate.getRangeStart()) >= 0
&& policySubObject.getSumInsured().compareTo(rate.getRangeEnd()) < 0) {
total = total.add(policySubObject.getSumInsured().multiply(rate.getPremiumRate()));
}
}
}
}
}
return total;
}
4 вложенных цикла вместе с условием выглядят очень тревожно. В конечном счете, для расчета премии необходимо go по каждой ставке, но я не смог найти лучшего способа сделать это.