为什么sumBy(selector)不返回Long?

Jon*_*son 14 kotlin

sumBy(selector)返回Int

sumByDouble(selector)返回Double

为什么sumBy不返回Long?这有解决方法吗?

mie*_*sol 23

这是Kotlin团队做出的决定.由于在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
}
Run Code Online (Sandbox Code Playgroud)

  • IMO它应该在stdlib中 (11认同)

Cly*_*yde 7

您也可以使用sum()扩展功能里面确实有一个Long变种,会同map()

val totalLength = files.map { it.length() }.sum()
Run Code Online (Sandbox Code Playgroud)

或者您可以将其包装到扩展函数中,尽管与内联版本相比,我看不出太多好处:

inline fun <T> Iterable<T>.sumByLong(selector: (T) -> Long): Long {
    return map { selector(it) }.sum()
}
Run Code Online (Sandbox Code Playgroud)


hqz*_*zwb 6

您可以选择使用fold函数。

val totalLength = files.fold(0L) { acc, it -> acc + it.length() }
Run Code Online (Sandbox Code Playgroud)

它并不比sumBy代码长多少。