这是我的代码。令我惊讶的是,它产生了一张地图,而不是我所期望的元组seq。在scala中获取元组列表的正确方法是什么?scala:产生一个元组而不是映射的序列
for ((_, s) <- Constants.sites;
line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
) yield ((s, line))
这是我的代码。令我惊讶的是,它产生了一张地图,而不是我所期望的元组seq。在scala中获取元组列表的正确方法是什么?scala:产生一个元组而不是映射的序列
for ((_, s) <- Constants.sites;
line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
) yield ((s, line))
的原因可能就是Constants.sites
是Map
,因此它返回一个地图。
而不是运行在Constants.sites
上的理解,运行它在Constants.sites.values
,你只是使用这些值。
的背景是,你的代码将被翻译成:
Constants.sites.flatMap {
case (_, s) =>
Source.fromFile(s"data/keywords/topkey$s.txt").getLines.map {
line =>
(s, line)
}
}
,并呼吁Map
flatMap
当你的结果类型也需要一个Map
,和元组可以被强制转换为Map
。
编辑:但是使用这个应该是罚款:
for {
(_, s) <- Constants.sites
line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
) yield ((s, line))
您可以在任何地图转换成一个序列是这样的:
scala> val m = Map(1->"one", 2 -> "two")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> one, 2 -> two)
scala> m.toSeq
res0: Seq[(Int, String)] = ArrayBuffer((1,one), (2,two))
在你的情况,你可能会做
val result = for ((_, s) <- Constants.sites;
line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines
) yield ((s, line))
result.toSeq
感谢您重构的代码。我试了一下,发现flatMap仍然没有像我期望的那样工作。但是,如果我们将flatMap更改为map {},那么我们将看到tuple2s的扁平Seq。 –
我会认为它是一个scala技巧 –
@HuCao等,更新了我的帖子。 'flatMap'和'map'的东西就是Scala去掉'for'的东西。 –