2016-11-07 5 views
0

Ich möchteLine aus einer Quelle abrufen und sie in ein Tupel (Int, Int) konvertieren. Ich habe es mit foreach gemacht.Scala - Liste [String] in Tupel konvertieren Liste [(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))) 
     }) 

Was ist der beste Weg, den gleichen Code ohne Verwendung foreach zu schreiben?

Antwort

3

Verwendung map, baut es eine neue Liste für Sie:

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 eine letzte Operation sein sollte, nicht eine Transformation.

In Ihrem Fall sollten Sie die Funktion 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

Mit einem for Verständnis verwenden:

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

wann vs einem 'map' ein' for' Verständnis jemand wählen? – Tyler

+0

'für' sind syntaktischer Zucker. Siehe http://stackoverflow.com/questions/1052476/what-is-scalas-yield/1059501#1059501. Sie werden in 'Karten'-Aufrufe (neben anderen Aufrufen) kompiliert. Ich finde '' '' '' leichter zu lesen, dann eine Reihe von angeketteten 'map' Calls. – Davidann

Verwandte Themen