2016-03-18 25 views
0

Gegeben zur KarteWie eine optionale Sammlung

val optionalList: Option[List[Int]] = Some(List(1,2,3)) 

ich zur Zeit die Elemente Karte etwas wie

optionalList.map(_.map(_ * 2)) 

mit mir nicht mag besonders die map(_.map( Syntax. Gibt es einen besseren Ansatz wie optionalList.mapValues(_ * 2) oder etwas ähnliches? Ich dachte über ein implizites Objekt zu schreiben, dies zu umgehen, aber vielleicht scala hat schon etwas, das ich nicht weiß, über

+2

auch prüfen, ob Sie nicht 'Karte gefällt (_. Karte (', Verwendung Es ist beschreibend, Leute verstehen, was es bedeutet, keine Magie. Prinzip der geringsten Überraschung. –

+0

Danke an alle für die Kommentare. Wie immer ich Es scheint, dass es viele gültige Möglichkeiten gibt, um mit diesem umzugehen, einschließlich der ursprünglichen Syntax von optionalList.map (_. map (...)). –

Antwort

1

Sie können monad transformers, z. scalaz ListT.

import scalaz._ 
import Scalaz._ 
import ListT._ 

val optionalList: Option[List[Int]] = Some(List(1,2,3)) 
val doubled = listT(optionalList).map(_ * 2).run 

aber am Ende, wie Jean-Philippe vorgeschlagen, für einen Fall, so einfach ich mit der klassischen Karte kleben würde (_ Karte (weiß jeder scala Programmierer, was es zu einem Mittel

Blick
0

Dies ist, was ich mit ...

implicit class OptionalSeq[I, O](input: Option[Seq[I]]) { 
    def mapContents(f: (I) => O): Option[Seq[O]] = { 
     input.map(_.map(f)) 
    } 
} 
... 
val optionalList: Option[Seq[Int]] = Some(Seq(1,2,3)) 
val doubled: Option[Seq[Int]] = optionalList.mapContents(_ * 2) 
1

kam Wenn Sie möchten, eine sein etwas expliziter als optionalList.map(_.map(_ * 2)) das ist, wie ich es tun würde.

val doubled = optionalList match { 
    case Some(list) => Some(list.map(_ * 2)) 
    case None  => None 
} 

Der andere Weg zu ‚lösen‘ Dies ist eine leere List statt None verwenden. Dies funktioniert nur, wenn es in Ihrer Problemdomäne sinnvoll ist.

val doubled = optionalList.getOrElse(List.empty).map(_ * 2) 
+0

Danke für deinen Vorschlag –

1

Sie waren etwa nicht explizit, welche Teil map(_.map(_ * 2)) Sie nicht mögen. wenn es der visuelle Aspekt ist, könnte man so etwas wie for (list <- optionalList) yield list.map(_ * 2)

+0

Entschuldigung, ich hätte erklären sollen, dass es nur der visuelle Aspekt war, wie du vermutet hast. Es scheint ein bisschen wie Val a = 1 + 2 statt val a = 3 zu schreiben. Ich mag deinen Vorschlag –

Verwandte Themen