首页 > 解决方案 > 计算所有列表元素的总和,直到满足条件

问题描述

我遇到了以下问题:我有一个对象列表。让它成为 Test 类的对象:

data class Test(
    var status: String, // Can be EXPIRED, WAIT
    var amount: Float
)

数组是排序的,有状态EXPIRED的对象位于开头和后面的对象的状态WAIT位于。我需要计算具有状态的所有元素的总和EXPIRED(如果它们存在),并添加到具有类型WAIT(如果存在)的第一个对象的总和。现在我有以下代码:

 private fun getRestructuringAmountToPay(): Float {
        var i = 0
        var sum = 0F
        list?.forEachIndexed { iter, el ->
            if (el.status != RestructingItemStatus.WAIT) {
                i = iter
                sum += el.amount ?: 0F
            }
        }
        if (i + 1 < (list?.size ?: 0)) {
            sum += list?.get(i+1)?.amount ?: 0F
        }
        return sum
    }

但是有什么方法可以改进这段代码并使它像 Kotlin 一样漂亮吗?提前感谢您的帮助!

标签: kotlin

解决方案


因为您的列表已排序并且 EXPIRED项目是第一个,您可以使用它firstOrNull 来查找第一个项目status == WAIT

当你迭代EXPIRED项目时,你可以使用一个简单的变量来求和amount,当你找到第一个WAIT项目时,只需将总和分配给amount

 var sum: Float = 0f
 list.firstOrNull {
     sum += it.amount
     it.status == "WAIT"
 }?.apply {
     this.amount = sum
 }

推荐阅读