Scala Option[String] zu Option[Double] konvertieren

kirdie

Bekanntes Mitglied
Gibts da was eleganteres als meine Lösung? (am besten in zwei Zeilen)

Java:
val s: Option[String] = Option("5")

val d : Option[Double] = 
	if(s.isDefined)
		Some(s.get.toDouble)
	else
		None
 
Zuletzt bearbeitet:

kirdie

Bekanntes Mitglied
Vielen Dank! Leider verstehe ich das trotz lesen deines Links (dem ich nicht so ganz folgen kann) nicht so richtig.
Kannst du vielleicht kurz erklären, was das Statement macht (so dass man es als Javaler verstehen kann)?
Ich habe erst einen Tag Scala - Erfahrung :)
 

Landei

Top Contributor
Meinst du mit "Statement" das "match"? Das ist so eine Art switch auf Anabolika mit eingebautem Pattern Matching.
Näheres hier: Musterlösung Patternmatching eSCALAtion Blog (schamlose Eigenwerbung!)

Die map-Funktion transformiert Werte innerhalb einer Collection, also z.B. von Strings zu deren Länge:
Code:
Array("sdfj","slfsdlkf","dlkfjdlj").map(_.length)
//-->  Array[Int] = Array(4, 8, 8)

Some("fdkjdkfj").map(_.length)
//--> Option[Int] = Some(8)

(None: Option[String]).map(_.length)
//--> Option[Int] = None

Der Unterstrich ist eine Kurzform zum Erzeugen einer Funktion (oder "Closure"):
Code:
//Langform
x => x.toDouble
//Kurzform
_.toDouble

//Langform
x => println(x)
//Kurzform
println(_)

//Langform
(x, y) => x min y
//Kurzform (nur möglich bei richtiger Reihenfolge der Variablen)
_ min _
(Achtung: der Unterstrich hat eine Reihe verschiedener Bedeutungen in Scala)
 
Zuletzt bearbeitet:

kirdie

Bekanntes Mitglied
Also dass map Werte einer Collection transformiert weiß ich schon aber ich habe ja hier keine Collection sondern eine Option? Oder ist eine Option etwas eine spezielle Collection mit 0 bis einem Element? Laut Scaladoc for scala.Option ist die Oberklasse von Option scala.Product und deren Oberklasse ist scala.Equals, da steht nirgendswo, das Option von Collection erbt...
 

Landei

Top Contributor
Einfache Antwort: Wie du schon sagst kann man Option als einen Container der Länge null bis eins auffassen, z.B. kann man option.foreach(println) schreiben (was dann eben den Inhalt x von Some(x) druckt, oder gar nix bei None). Man kann aber z.B. auch "Surprise".foreach(println) schreiben, ohne dass String eine Collection-Klasse wäre.

Komplizierte Antwort: Container-Typen wie Option gehören (unabhängig davon, wie sich die Klassenhierarchie gestaltet) strukturell zu den Monaden, und auf diesen lassen sich sehr abstrakt bestimmte nützliche Operationen (wie map, flatMap, flatten, filter, foreach ...) definieren, die sich in den konkreten Typen unterschiedlich, aber konsistent verhalten.
 
Zuletzt bearbeitet:
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben