如何在Kotlin 1.5中用sumOf替代sumBy

6
我有以下代码:
val sum = list.itens.sumBy { item ->
    when (item.intValueI == item.intValueII) {
        true -> 1
        else -> 0
    }
}

当我更新到 Kotlin 1.5 时,我收到了 deprecated 警告;我应该如何继续实现相同的功能?

我尝试了以下方法:

val result = list.itens.sumOf<ListItemClass> { item ->
    val intValueI = item.value ?: 0
    val intValueII = item.valueII ?: 0
    when(item.intValueI == item.IntValueII){
        true -> 1
        else -> 0
    }
}
1个回答

6
为什么不筛选你的项目并计算它们,而不是涉及数学,因为这似乎是你想要的?
val sum = list.items.filter { it.intValue1 == it.intValue2 }.size

或者,更加简单地说(感谢评论中的Tenfour04!):

val sum = list.items.count { it.intValue1 == it.intValue2 }

如果由于某种原因绝对必须使用 sumOf,那么一个有点巧妙的解决方案是:
val sum = list.items.sumOf { 
  if (it.intValue2 == it.intValue2) 1 else 0 as Int
}

看起来编译器/Android Studio在返回1和0时会有些混乱,因此需要一个else,可以是it.intValue1 * 00 as Int。前者比较凌乱,但后者会留下一个AS警告。


我正在尝试理解文档[1]中描述的“选择器”应该是什么。Android Studio的自动替换失败了。[1] https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/sum-of.html - João Carlos
你不需要使用sumOf或选择器。使用过滤和获取大小将提供相同的结果,逻辑更简单,代码更少。 - Jake Lee
1
更简单的写法:val sum = list.items.count { it.intValueI == it.intValueII } - Tenfour04
2
你也可以使用 as Int 来避免这种 hacky 的方式,尽管这会触发一个 No Cast Needed 警告。不确定为什么编译器在这种情况下无法分辨 1 和 0 都是 Ints 而不是 Longs。 - Tenfour04
1
这是对似乎是编译器错误的一种解决方法。 - Tenfour04
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接