【发布时间】:2018-11-20 15:00:57
【问题描述】:
我想在 Kotlin 中编写一个函数,该函数接受一个字符串数组并将数组中所有项的长度相加。我想到了这样的事情:
fun sumItems(values: Array<String?>): Int {
var sum: Int = 0
values.forEach { if(it != null) sum += it.length }
return sum
}
这很好用,但不幸的是我不能为Array<String> 调用这个方法,因为我得到一个类型不匹配的错误。我也无法创建函数sumItems(values: Array<String>): Int,因为它具有相同的 JVM 签名。我可以将我的论点转换为Array<String?>,但这是不安全的。
那么在 Kotlin 中有没有更好的方法来做到这一点?
【问题讨论】:
-
您真的需要该功能吗?
fun sumItems(values: Array<String>) : Int还不够吗?如果没有,那么只需使用Array<out String?>作为参数类型。 Yoni Gibbs 的回答已经表明了这一点,以及该方法如何更简化...... -
我会将其声明为
sumItems(values: Array<String>),当我需要传递Array<String?>时,我会使用filterNotNull对其进行过滤。 -
我会采取与@m0skit0 相同的路线。这使代码更加清晰和干净;-)
-
然而 filterNotNull 返回一个列表 :(
-
调用
filterNotNull的问题在于您正在内存中创建第二个集合。而且您必须执行两次循环。在大多数情况下,这可能可以忽略不计,但如果处理大量数据,这并不是最有效的方法。