Joh*_*nDo 2 functional-programming scala
val list = List()
for(i <- 1 to 10){
list:+i
}
println(list)
Run Code Online (Sandbox Code Playgroud)
这最终给了我一个空列表,尽管它应该填充 1 到 10 的数字?我有一个理论,由于“:”运算符,它每次都会创建一个新列表,但我并不完全确定。我已经使用 ListBuffer 解决了这个问题,但我想学习如何使用不可变列表来解决这样的问题。谢谢。
对于此类问题没有单一的功能解决方案,但这里有一些选择。
对于问题中的简单情况,您可以这样做
List.range(1,11) // List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Run Code Online (Sandbox Code Playgroud)
如果您想根据索引计算每个元素的不同值,请使用tabulate:
List.tabulate(10)(x => x*3) // List(0, 3, 6, 9, 12, 15, 18, 21, 24, 27)
Run Code Online (Sandbox Code Playgroud)
(如果逻辑比这个复杂,可以传递一个函数)
如果您正在构建列表但不确定是否需要每个元素,请使用Optionand then flatten:
def genValue(i: Int): Option[Int] = ???
List.tabulate(10)(genValue).flatten
Run Code Online (Sandbox Code Playgroud)
genValue这将丢弃返回的所有值None并提取Int返回的值Some(???)。
如果每个操作可能返回不同数量的元素,请使用Listthen flatten:
def genValue(i: Int): List[Int] = ???
List.tabulate(10)(genValue).flatten
Run Code Online (Sandbox Code Playgroud)
List这将从返回的所有值中取出所有元素genValue并将它们放入一个List[Int].
List如果事先未知 的长度,则最佳解决方案可能是递归函数。虽然一开始这似乎令人畏惧,但值得学习如何使用它们,因为它们通常是解决问题的最干净的方法。
| 归档时间: |
|
| 查看次数: |
1066 次 |
| 最近记录: |