sumBy*
必须根据返回类型具有不同的名称。sumByLong
很容易:inline fun <T> Iterable<T>.sumByLong(selector: (T) -> Long): Long {
var sum = 0L
for (element in this) {
sum += selector(element)
}
return sum
}
var sum: Long = 0.0
无法编译,我已将其更改为0L
。 - Kirill RakhmanIterable_.kt
,但我也见过 Iterables.kt
。 - miensolsum()
扩展函数,它还有一个 Long
变体,与 map()
结合使用。val totalLength = files.map { it.length() }.sum()
或者您可以将此包装成扩展函数,尽管我没有看到与内联版本相比的太多好处:
inline fun <T> Iterable<T>.sumByLong(selector: (T) -> Long): Long {
return map { selector(it) }.sum()
}
你可以选择使用fold
函数。
val totalLength = files.fold(0L) { acc, it -> acc + it.length() }
这段代码与 sumBy
代码相比并不长。
sumOf
,它根据函数参数的返回类型解析类型:// prints 2^31 - 1 = 2147483647
println((0..30).sumOf{ 1 shl it })
// prints -1 due to 32-bit overflow
println((0..31).sumOf{ 1 shl it })
// prints 2^32 - 1 = 4294967295 because it works with 64-bit longs
println((0..31).sumOf{ 1L shl it })