2015-06-12 2 views

ответ

1

Причина, вероятно, в том, что 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) 
    } 
} 

И при вызове flatMap на Map ваш тип полученной в результате также должен быть Map и кортежи могут быть принуждены к Map.

EDIT: Но использовать это должно быть прекрасно:

for { 
    (_, s) <- Constants.sites 
    line <- Source.fromFile(s"data/keywords/topkey$s.txt").getLines 
) yield ((s, line)) 
+0

Спасибо за реорганизованный код. Я попробовал это и обнаружил, что flatMap все еще не работает, как я ожидал. Однако, если мы изменили flatMap на карту {}, сгладим, тогда мы увидим сглаживание Seq из tuple2s. –

+0

Я буду считать это scala трюк –

+0

@HuCao ждать, обновил мое сообщение. «FlatMap» и «map» - это то, что Scala de-sugars «for» to. –

0

Вы можете конвертировать любой карты в послед так:

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 
Смежные вопросы