2016-11-07 146 views
0

我想從一個源獲取線並將其轉換爲元組(Int,Int)。我用foreach做過。斯卡拉 - 轉換列表[字符串]元組列表[(Int,Int)]

 val values = collection.mutable.ListBuffer[(Int, Int)]() 

     Source.fromFile(invitationFile.ref.file).getLines().filter(line => !line.isEmpty).foreach(line => { 
      val value = line.split("\\s") 

      values += ((value(0).toInt, (value(1).toInt))) 
     }) 

什麼是不使用foreach編寫相同代碼的最佳方法?

回答

3

使用map,它建立一個新的列表供您:

Source.fromFile(invitationFile.ref.file) 
.getLines() 
.filter(line => !line.isEmpty) 
.map(line => { 
    val value = line.split("\\s") 
    (value(0).toInt, value(1).toInt) 
}) 
.toList() 
1

foreach應該是最終的操作,而不是改造。

在你的情況,你要使用的功能map

val values = Source.fromFile(invitationFile.ref.file).getLines() 
    .filter(line => !line.isEmpty) 
    .map(line => line.split("\\s")) 
    .map(line => (line(0).toInt, line(1).toInt)) 
0

使用for理解:

val values = for(line <- Source.fromFile(invitationFile.ref.file).getLines(); if !line.isEmpty) { 
    val splits = line.split("\\s") 
    yield (split(0).toInt, split(1).toInt) 
} 
+0

時應有人選擇'for'理解VS了'map'? – Tyler

+0

'''是句法糖。請參閱http://stackoverflow.com/questions/1052476/what-is-scalas-yield/1059501#1059501。他們會被編譯成'map'調用(以及其他調用)。我發現''''更容易閱讀,然後進行一連串的「地圖」鏈接調用。 – Davidann

相關問題