问题描述
我有点困惑。我只是尝试使用reduce 函数创建一个字符串,以编号顺序表示列表的元素。代码如下:
val names = listof("John","Billy","Tom","Joe","Eric","Jerry")
val result = names.reduce { accum,name -> "$accum ${names.indexOf(name) + 1}. $name" }
println(result) // John 2. Billy 3. Tom 4. Joe 5. Eric 6. Jerry
// ^ missing 1.
我期望累加器的值在每次迭代后累加:
“1. 约翰”
“1. 约翰 2. 比利”
“1. 约翰 2. 比利 3. 汤姆”
“1. 约翰 2. 比利 3. 汤姆 4. 乔”
“1. 约翰 2. 比利 3. 汤姆 4. 乔 5. 埃里克”
“1. 约翰 2. 比利 3. 汤姆 4. 乔 5. 埃里克 6. 杰瑞”
当我运行代码时,它会打印:John 2. Billy 3. Tom 4. Joe 5. Eric 6. Jerry
我不明白为什么是“1”。不见了,
解决方法
Reduce 函数使用您的第一个值作为起始累加器。
所以操作只适用于 (((1 -> 2) -> 3) -> 4)
对之间。
您可以使用 fold 函数实现预期行为,该函数采用初始值:
val result = names.fold("") { accum,name -> "$accum ${names.indexOf(name) + 1}. $name" }