Beispiele für die Verwendung einiger Scala Option-Methoden

7

Ich habe den Blogbeitrag gelesen, der mir empfohlen wurde hier . Jetzt frage ich mich, wofür einige dieser Methoden nützlich sind. Können Sie Beispiele zur Verwendung von forall (im Gegensatz zu foreach ) und toList von Option ?

zeigen?     
Michael 26.07.2011, 16:04
quelle

3 Antworten

6

Ich habe ein praktisches Beispiel für toList Methode. Sie finden es in scaldi (mein Scala-Abhängigkeits-Injection-Framework) in Module.scala in Zeile 72:

Zypern

In diesem Zusammenhang kann die Methode getBindings entweder Nil oder List mit nur einem Element ausgeben. Ich kann es als Option mit discoverBinding abrufen. Ich finde es bequem, Option in List (das entweder leer ist oder ein Element hat) mit toList method zu konvertieren.

    
tenshi 26.07.2011, 16:14
quelle
24
  • map : Erlaubt es Ihnen, einen Wert "inside" in Option zu transformieren, wie Sie wahrscheinlich bereits für List s wissen. Diese Operation macht Option zu einem Funktor (du kannst "endofunctor" sagen, wenn du deine Kollegen erschrecken willst)
  • flatMap : Option ist eigentlich eine Monade und flatMap macht sie eins (zusammen mit etwas wie einem Konstruktor für einen einzelnen Wert). Diese Methode kann verwendet werden, wenn Sie eine Funktion haben, die einen Wert in Option umwandelt, aber der Wert, den Sie haben, bereits in ein Option "eingepackt" ist, so dass flatMap Ihnen das Auspacken vor dem Anwenden der Funktion erspart. Z.B. Wenn Sie Option[Map[K,V]] haben, können Sie mapOption.flatMap(_.get(key)) schreiben. Wenn Sie hier ein einfaches map verwenden, erhalten Sie Option[Option[V]] , aber mit flatMap erhalten Sie Option[V] . Diese Methode ist cooler, als Sie vielleicht denken, da sie es erlaubt, Funktionen sehr flexibel miteinander zu ketten (was ein Grund ist, warum Haskell Monaden liebt).
  • flatten : Wenn Sie einen Wert vom Typ Option[Option[T]] haben, verwandelt flatten ihn in Option[T] . Es ist das gleiche wie flatMap(identity(_)) .
  • orElse : Wenn Sie mehrere Alternativen in Option s eingeschlossen haben und Sie möchten, dass die erste einen Wert enthält, können Sie diese Alternativen mit orElse verknüpfen: steakOption.orElse(hamburgerOption).orElse(saladOption)
  • getOrElse : Holen Sie den Wert aus Option , geben Sie aber einen Standardwert an, wenn dieser leer ist, z. %Code%.
  • nameOption.getOrElse("unknown") : Tue etwas mit dem Wert drinnen, falls es existiert.
  • foreach , isDefined : Bestimmen Sie, ob diese isEmpty einen Wert enthält.
  • Option , forall : Prüft, ob ein bestimmtes Prädikat für den Wert gilt. exists ist identisch mit forall , option.map(test(_)).getOrElse(true) ist identisch, nur mit exists als Standard.
  • false : Überraschung, konvertiert toList in Option .
Landei 26.07.2011 21:50
quelle
10

Viele der Methoden von Option können eher der Einheitlichkeit (mit Sammlungen) wegen ihrer Nützlichkeit dienen, da sie alle sehr kleine Funktionen sind und daher nicht viel Mühe ersparen, aber sie dienen einem Zweck, und Ihre Bedeutung wird deutlich, sobald Sie mit dem Sammlungsframework vertraut sind (wie oft gesagt wird, ist Option wie eine Liste, die nicht mehr als ein Element haben kann).

forall prüft eine Eigenschaft des Werts innerhalb einer Option. Wenn kein Wert vorhanden ist, wird der Check bestanden. Zum Beispiel, wenn Sie in einer Autovermietung nur 1 additionalDriver: Option[Person] haben, können Sie

tun %Vor%

genau das gleiche, was Sie tun würden, wenn mehrere zusätzliche Treiber erlaubt wären und Sie eine Liste hätten.

toList kann eine nützliche Konvertierung sein. Angenommen, Sie haben Optionen: Listen Sie [Option [T]] auf, und Sie möchten eine Liste [T] mit den Werten aller Optionen erhalten, die Einige sind. Sie können

tun %Vor%

(oder besser options.flatMap(_.toList) )

    
Didier Dupont 26.07.2011 16:38
quelle

Tags und Links