2016-11-07 135 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