是否可以在 Kotlin 中使用 vararg 实现序列编程?

如何解决是否可以在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?