如何解决是否可以在 Kotlin 中使用 vararg 实现序列编程?
我一直在尝试序列编程来处理我从 vararg 参数中获得的数据。我想将列表中的每个数字相乘并将其添加到新的数组列表中。是否可以使用序列。
我附上以下代码:
fun main() {
val number = asList(10,20,30,40,50)
print(number)
}
fun <T> asList(vararg input: T): List<T> {
val result = ArrayList<T>()
input.map {it * 2}.foreach(result.add(it))
return result
}
这是我得到的错误: enter image description here
解决方法
是的,可以从可变参数创建序列;稍后我会回到这个话题。
首先,上面代码的主要问题是,不幸的是,它不能通用。你得到的错误是因为 T
可以是任何类型,而且大多数类型不能相乘,所以编译器告诉你你不能做 * 2
。
您可能会考虑将 T
限制为 Number
的子类,但这无济于事。 (Number
是一种非常弱的类型;它不允许您进行任何算术运算,可能是因为您无法确定结果必须是什么类型,也无法确定可能发生的舍入或溢出。 所有它都可以让您做的是将值转换为特定类型。)
但是如果您删除类型参数并将其编码为特定的数字类型,例如 Int
,那么它可以正常工作。
foreach
调用周围的代码中也存在拼写和语法错误。修复这些也给出了例如:
fun asList(vararg input: Int): List<Int> {
val result = ArrayList<Int>()
input.map{ it * 2 }.forEach{ result.add(it) }
return result
}
不过,这做了很多不必要的工作; map()
已经返回一个列表,因此创建第二个列表并逐个复制到它是没有意义的!此外,该名称具有误导性。所以它可能只是:
fun asListDoubled(vararg input: Int) = input.map{ it * 2 }
您的问题提到了序列;但是您的代码使用普通的急切列表。如果你想要一个惰性求值的序列,你可以添加一个 asSequence()
调用,例如:
fun asSequenceDoubled(vararg input: Int) = input.asSequence().map{ it * 2 }
但请注意,现在返回的是 Sequence<Int>
,而不是 List<Int>
,因此您可以继续对其进行进一步的惰性操作。 (如果你想要一个 List<Int>
,那么你可以只附加一个 toList()
调用——但是使用一个序列只用于加倍是没有意义的,因为序列开销可能远高于任何节省。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。