Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Kotlin中的long列表创建新的字符串列表?(如有可能,请在线)_Kotlin - Fatal编程技术网

如何从Kotlin中的long列表创建新的字符串列表?(如有可能,请在线)

如何从Kotlin中的long列表创建新的字符串列表?(如有可能,请在线),kotlin,Kotlin,我在Kotlin中有一个long列表,我想让它们成为用于UI目的的字符串,可能带有一些前缀,或者以某种方式进行修改。例如,在前面添加“$”或在末尾添加“美元”一词 我知道我可以简单地迭代它们,就像: val myNewStrings = ArrayList<String>() longValues.forEach { myNewStrings.add("$it dollars") } val myNewStrings=ArrayList() longValues

我在Kotlin中有一个long列表,我想让它们成为用于UI目的的字符串,可能带有一些前缀,或者以某种方式进行修改。例如,在前面添加“$”或在末尾添加“美元”一词

我知道我可以简单地迭代它们,就像:

val myNewStrings = ArrayList<String>()
longValues.forEach { myNewStrings.add("$it dollars") }
val myNewStrings=ArrayList()
longValues.forEach{myNewStrings.add(“$it美元”)}
我想我只是变得挑剔了,但我觉得有一种方法可以内联这个列表,或者在不创建新字符串列表的情况下更改原来的长列表


编辑/更新:很抱歉,我的术语最初有点混乱。我的意思是在一行中编写代码,而不是内联函数。我知道这是可能的,但我不记得在撰写本文时kotlin的
map
函数特性。谢谢大家提供的有用信息。我学到了很多,谢谢。

您正在寻找一张地图,一张地图需要一个lambda,并根据lambda的结果创建一个列表

val myNewStrings = longValues.map { "$it dollars" }

map
是一个扩展,它有两个泛型类型,第一个用于知道迭代的是什么类型,第二个用于知道返回的是什么类型。我们作为参数传递的lambda实际上是
transform:(T)->R
,因此您可以看到它必须是一个函数,它接收一个
T
,这是源类型,然后返回一个
R
,这是lambda结果。Lambdas不需要指定return,因为默认情况下最后一行是return。

您可以使用
列表上的
map
-函数。它创建了一个新列表,其中每个元素都应用了一个函数

像这样:

val myNewStrings = longValues.map { "$it dollars" }
在Kotlin中是一个关键字,它指的是编译器直接用函数的内容替换函数调用。我不认为这就是你在这里要问的。也许你的意思是你想把代码写在一行上

您可能需要阅读集合文档,特别是本节

映射转换从 函数在另一个集合的元素上运行。基本映射 功能是 . 它将给定的lambda函数应用于每个后续元素和 返回lambda结果的列表。结果的顺序是 与元素的原始顺序相同

val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
就你的例子来说,这就像其他人说的:

val myNewStrings = longValues.map { "$it dollars" }
我觉得有一种方法可以内联这个或更改原来的长列表,而不创建新的字符串列表


不可以。您有
Long
s,您需要
String
s。唯一的方法是创建新的
String
s。您可以通过将原始列表的类型从
List
更改为
List
并对其进行适当编辑来避免创建新的
列表
,但这样做会过于繁琐,使代码过于复杂,更难理解,更容易出错。

正如人们所说,除非这里存在性能问题(就像十亿个字符串,你只使用了一小部分)仅仅创建你想要的列表可能是一种方法。不过你有一些选择

当有一个较长的操作链时,它们会延迟评估,依次完成每个项目的链,而不是为链中的每个操作创建一个中间完整列表。因此,如果您只需要某些项目,或者您希望提前停止,这可能意味着更少的内存使用和更高的效率。虽然它们有开销,但您需要这样做当然这是值得的,而且对于您的用例(将一个列表转换为另一个列表),没有中间列表可以避免,我猜您正在使用整个列表。可能最好只制作一次
字符串
列表,然后使用它

您的另一个选择是创建一个函数,该函数使用
Long
并生成
字符串
——基本上是传递给
map
的任何函数,除非在需要时使用它。如果您有大量的
Long
,并且确实不希望内存中包含所有可能的
字符串
版本,则只需生成无论何时显示它们,都可以吃掉它们。如果您愿意,可以将其作为扩展函数或属性,这样您就可以继续了

fun Long.display() = "$this dollars"
val Long.dollaridoos: String get() = "$this.dollars"

print(number.display())
print(number.dollaridoos)
或者制作一个包装器对象来保存您的列表,并提供对字符串化版本的值的访问权限。不管您的问题是什么



另外,
map
方法比创建一个
ArrayList
并添加到其中更有效,因为它可以从一开始就分配一个具有正确容量的列表-当列表太大时,任意添加到一个未大小的列表将使其不断增长,然后它必须复制到另一个列表(更大)数组…直到它填满,然后它再次发生…

为什么不创建一个新的字符串列表?您分析了您的代码并发现这是一个瓶颈吗?“我觉得有一种方法可以内联这个或更改原始的长列表而不创建新的字符串列表?”这与函数式编程方法和bes相违背即使是在Java这样的非功能性语言中也不例外。始终努力使事物不可变,这就是Kotlin的默认行为的原因。很难对不断变化的变量进行推理,而通过操纵创建新列表更容易推理。私有扩展是有意义的,但要使其成为global似乎打破了扩展的预期用途,它只是一个例子,如果你想,如果它能让你的代码更具可读性,你可以这样做。把它放在任何你觉得合适的范围内!这就是扩展的目的,可读性和添加到你不控制的类中(比如
Long
)但不,你可能不希望
Long
s在你的应用程序中到处都有“makeprice string”属性……除非你愿意!基本上,只要对你有用就行