2009-03-19 14 views

Antwort

14

In dem Fall, wo it ein Iterable

val it:Iterable[Option[T]] = ... 
it.flatMap(x => x)    //returns an Iterable[T] 

In dem Fall, wo it ein In neueren Versionen ist dies Iterator

val it:Iterator[Option[T]] = ... 
it.flatMap(x => x elements)  //returns an Iterator[T] 
it.flatMap(_ elements)    //equivalent 
+0

Zu wissen, wer du bist (aus der scala-user mailing list), du hast recht ich bin mir sicher (habe im Moment keinen Zugriff auf meine Scala dev envt :-). Kannst du ein bisschen erklären, wie das funktioniert. Ich verspreche, ich bin kein Idiot, aber ich habe keine Ahnung, wie ich das von der Scaladoc bekommen sollte. –

+0

Wäre es nicht "it flatMap {_ elements}"? (Ich habe das Scaladoc schon wieder gelesen!) –

+1

Es wäre toll Scala Gurus auf StackOverflow zu sehen. Die scala-user mailing list füllt meinen Posteingang mit obskuren Argumenten über break/continue :-) –

10

ist jetzt möglich:

val it: Iterator[Option[T]] = ... 
val flatIt = it.flatten 
+1

Nun ja, JETZT würden Sie. Wenn die Frage gestellt und beantwortet wurde, hat das nicht funktioniert. (Für den Fall, dass Sie nicht sagen können, trägt Ihre Verwendung des Wortes "einfach" die Implikation, dass es den vorherigen Diskutanten gelungen ist, die einfache Antwort zu übersehen.) – extempore

+0

@Extempore: Du hast Recht. Ich habe meinen Kommentar korrigiert. – soc

5

Diese funktioniert für mich (Scala 2.8):

it.collect {case Some(s) => s} 
3

Für mich ist dies ein klassischer Anwendungsfall für die monadische Benutzeroberfläche.

for { 
    opt <- iterable 
    t <- opt 
} yield t 

Es ist nur Zucker für die flatMap oben beschriebene Lösung, und es produziert identisch Bytecode. Allerdings ist Syntax wichtig, und ich denke, eine der besten Zeiten, um Scala monadischen for Syntax verwenden, ist, wenn Sie mit Option arbeiten, vor allem in Verbindung mit Sammlungen.

Ich denke, diese Formulierung ist wesentlich besser lesbar, vor allem für diejenigen, die nicht mit der funktionalen Programmierung vertraut sind. Ich versuche oft sowohl die monadischen als auch die funktionalen Ausdrücke einer Schleife und sehe, was einfacher scheint. Ich denke, flatMap ist ein harter Name für die meisten Leute zu grok (und tatsächlich, ruft es >>= macht intuitiver Sinn für mich).

Verwandte Themen