为什么sumBy(选择器)不返回Long?

时间:2016-05-31 04:50:21

标签: kotlin

sumBy(selector)返回Int

sumByDouble(selector)返回Double

为什么总和没有返回?有解决方法吗?

3 个答案:

答案 0 :(得分:19)

这是Kotlin团队做出的决定。由于它是not possible to have return type overloads in JavasumBy*必须根据返回类型具有不同的名称。

虽然很容易添加自己的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()扩展功能Longmap()

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代码。