我有一个函数,它接受一个值并返回一对pair的列表,配对。
和一个密钥集,flightPass.keys
我想编写一个for循环,为flightPass.keys的每个值运行pairUp,并返回所有这些返回值的大列表。
val result:List[(Int, Int)] = pairUp(flightPass.keys.toSeq(0)).toList
for (flight<- flightPass.keys.toSeq.drop(1))
{val result:List[(Int, Int)] = result ++ pairUp(flight).toList}
我在此尝试了一些不同的变体,总是得到错误:
<console>:23: error: forward reference extends over definition of value result
for (flight<- flightPass.keys.toSeq.drop(1)) {val result:List[(Int, Int)] = result ++ pairUp(flight).toList}
^
我觉得这应该适用于其他语言,所以我在这里做错了什么?
答案 0 :(得分:0)
首先,您已将result
定义为val
,这意味着它是不可变的,无法修改。
因此,如果您要为pairUp
&#34;的每个值应用&#34; flightPass.keys
,为什么不map()
?
val result = flightPass.keys.map(pairUp) //add .toList if needed
答案 1 :(得分:0)
将值列表转换为列表列表然后将它们缩减为单个列表的Scala方法称为flatMap
,它是 map的缩写,然后展平。你可以这样使用它:
flightPass.keys.toSeq.flatMap(k => pairUp(k))
这将从flightPass.keys
获取每个“密钥”并将其传递给pairUp
(映射部分),然后将每次调用生成的List
转换为pairUp
然后'压平'它们,产生一个单一的连接列表。