【问题标题】:Nested for loops optimization嵌套 for 循环优化
【发布时间】:2020-05-18 12:47:05
【问题描述】:

有没有办法优化下面的代码:

  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 个嵌套循环和一个条件看起来非常令人不安。最终,需要检查每个费率来计算溢价,我找不到更好的方法。

【问题讨论】:

  • 所以您只关心代码的外观。这里实际上没有性能瓶颈,对吧?
  • 代码审查难道不是一个更好的地方吗?
  • 如果你不喜欢它的外观,把它分成方法。例如,Rate getRateForSubPolicy(Risk risk, BigDecimal sumInsured) 为保险金额选择正确的费率。然后是一个循环,为您提供所有风险的总和,然后是一个为您提供所有子策略总和的方法。
  • 并行流可能会带来一些性能提升。它还有助于 IMO 的可读性
  • 我不知道您的方法的上下文,但如果集合有很多对象,该方法可能会很慢。每次有人修改策略对象并将总值保存在策略对象的实例变量中时,您都会计算总数:这样更新对象时的速度比询问值的速度要慢。真正的问题是:值是更多请求还是更新?

标签: java arrays for-loop optimization


【解决方案1】:

这里似乎没有明显的解决方案,如果这里需要循环,则无法摆脱它们。

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 2020-08-28
    相关资源
    最近更新 更多