斯卡拉。需要循环,迭代返回增长列表

时间:2017-11-28 21:24:02

标签: scala

我有一个函数,它接受一个值并返回一对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}
                                                                             ^

我觉得这应该适用于其他语言,所以我在这里做错了什么?

2 个答案:

答案 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然后'压平'它们,产生一个单一的连接列表。