答案 0 :(得分:19)
这是Kotlin团队做出的决定。由于它是not possible to have return type overloads in Java,sumBy*
必须根据返回类型具有不同的名称。
虽然很容易添加自己的sumByLong
:
inline fun <T> Iterable<T>.sumByLong(selector: (T) -> Long): Long {
var sum = 0L
for (element in this) {
sum += selector(element)
}
return sum
}
答案 1 :(得分:1)
您还可以结合使用sum()
扩展功能Long
和map()
val totalLength = files.map { it.length() }.sum()
或者您可以将其包装到扩展函数中,尽管与内联版本相比,我看不出太多好处:
inline fun <T> Iterable<T>.sumByLong(selector: (T) -> Long): Long {
return map { selector(it) }.sum()
}
答案 2 :(得分:1)
您可以选择使用fold
函数。
val totalLength = files.fold(0L) { acc, it -> acc + it.length() }
它的长度不超过sumBy
代码。