Frage

Wenn ich so etwas wie ein List[Option[A]] haben und ich möchte diese in eine List[A] konvertieren, der normale Weg ist die Verwendung flatMap:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

Jetzt o => o ist nur eine Identitätsfunktion. Ich würde es habe gedacht, irgendeine Weise zu tun:

l.flatMap(Identity) //return a List[String]

Allerdings kann ich diese nicht an der Arbeit, da Sie nicht ein object generify können. Ich habe versucht, ein paar Dinge ohne Erfolg; hat, so etwas zu arbeiten?

jemand bekommt
War es hilfreich?

Lösung

Es gibt eine Identität Funktion in Predef .

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

A für expresion ist schöner, nehme ich an:

for(x <- l; y <- x) yield y

Edit:

Ich habe versucht, herauszufinden, warum die der Typparameter (Option [String]) benötigt wird. Das Problem scheint die Typumwandlung von Option [T] zu Iterable [T] zu sein.

Wenn Sie definieren die Identitätsfunktion als:

l.flatMap( x => Option.option2Iterable(identity(x)))

kann der Typ-Parameter weggelassen werden.

Andere Tipps

FWIW, auf Scala 2.8 Sie rufen Sie einfach flatten darauf. Thomas es meist hat für Scala 2.7 abgedeckt. Er verpasste nur eine Alternative Art und Weise, dass die Identität der Verwendung:

l.flatMap[String](identity)

Es wird nicht mit Operator Notation Arbeit, aber (es scheint Notation Bediener nicht Typparameter akzeptieren, was gut ist zu wissen).

Sie können auch Aufruf flatten auf Scala 2.7 (auf einem List zumindest), aber es wird ohne einen Typen nicht in der Lage sein, etwas zu tun. Doch diese Arbeiten:

l.flatten[String]

Sie könnten nur die Art Rückschließer eine wenig Hilfe geben:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top