2016-07-07 6 views
1

Ich bin neu bei scala und habe nur ein paar Beispiele erstellt, um es besser zu verstehen. Ich kann dieses Problem hier anscheinend nicht herausfinden - ich erstelle eine Liste von Strings in meinem Java-Programm und verwende diese Liste in meinem Scala-Programm. Mein Scala-Code zum Lesen der Liste aus der Java-Klasse sieht ungefähr so ​​aus.Wie man flatMap in scala verwendet, um eine Menge von "Vals" zu gruppieren

private val stringList : Seq[List] = x.getStringName //gets the list from my java program. 

Die String enthält

["How", "Are", "You"]. 

Ich versuche, einen Weg zu finden, diese Strings auf Werte genannt a, b und c an, so dass sie später auf einem Argumente an eine andere Funktion übergeben werden konnte .

val values = stringList.flatMap{ 
    case x if (!stringList.isEmpty) => 

     val a = /*should get the first string How*/ 
     val b = /*should get the second string Are*/ 
     val c = /*should get the third string You*/ 

    case _ => None 
} 

getCompleteString(a,b,c); 

Aber das funktioniert nicht. Ich tgives mir einen Fehler, der

"type mismatch; found : Unit required: scala.collection.GenTraversableOnce[?]" 

sagt, ich benutze nicht, warum dies geschieht. Könnte mir jemand sagen, was mache ich hier falsch?

Es tut mir leid, wenn der Code schmutzig aussieht, aber ich bin ein Anfänger und versuche immer noch, die Sprache zu verstehen. Jede Hilfe wird geschätzt. Vielen Dank im Voraus.

+0

Sind Sie sicher, dass Ihre 'stringList' den Typ 'Seq [List]' hat? Sollte es nicht 'List [String]' oder 'Seq [String]' oder was auch immer sein? Sie können den Typ entfernen und sehen, was Ihnen Ihre IDE über den Typ mitteilt. –

Antwort

1

Es gibt viele Möglichkeiten, es zu tun:

val a = stringList(0) 
val b = stringList(1) 
val c = stringList(2) 

val (a, b, c) = stringList match { 
    case first :: second :: third :: _ => (first, second, third) 
    case _ => ("default for a", "default for b", "default for c") // default case.. 
} 

Der erste Ansatz ist Java-ish, durch den Index, aber Sie haben zu prüfen, ob die Elemente sind, z.B. nicht-null oder was auch immer.

Die zweite verwendet Tupel, wo Sie mehrere Werte gleichzeitig zuweisen. Wenn die Liste mindestens 3 Elemente hat (erste Fallanweisung), dann werden sie einem (a, b, c) Tupel zugewiesen, und dann können Sie a, b, c ... verwenden, wenn die Liste weniger als 3 Elemente hat , Standardwerte werden verwendet (0,0,0).

Ich bin sicher, dass es in Scala mehr Möglichkeiten gibt, dies zu erreichen.

+0

Hey @ Insan-e danke dafür. Für den Fall, dass ich anstelle von String eine Liste von Objekten verwende, wie mache ich dann dasselbe? Könnten Sie so freundlich sein, auch etwas dazu zu sagen? – Goldengirl

+0

Es sollte für jede Art von Liste gleich sein, da es generisch ist, List [T]. :) –

+0

Der Rückgabetyp aus allen case-Anweisungen MUSS identisch sein, um ihn zB dem tuple3 zuzuweisen. –

Verwandte Themen