Konvertieren Scala Option, um Java Optional
Muss ich konvertieren Scala Option, um Java Optional. Ich schaffte es schrieb:
public <T> Optional<T> convertOption2Optional(Option<T> option) {
return option.isDefined() ? Optional.of(option.get()) : Optional.empty();
}
Aber ich mag es nicht.
Gibt es eine einfache Möglichkeit, es zu tun, oder eine built-in-scala-Konverter?
Ich bin auf der Suche nach etwas wie:
Options.asJava(option);
- Warum nicht erstellen Sie einfach eine statische Methode
asJava(Option<T> opt)
in einem selbst definiertenOptions
Klasse? - Ich könnte, aber das ist ein anderes Stück code zu erhalten, würde ich gerne den "standard-Weg"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den kürzesten Weg, die ich denken kann, in Java ist:
@RégisJean-Gilles tatsächlich vorgeschlagen, sogar noch kürzer, wenn Sie sind das schreiben der Umwandlung in Scala:
Übrigens müssen Sie wissen, dass die Scala kein Java 8 bis Scala 2.12, die ist nicht offiziell noch raus. Blick auf die docs (das kann sich ändern bis zum release) es gibt keine solche Umwandlung in
JavaConversions
.JavaConversions
überhaupt.JavaConverters
ist ein bevorzugter Weg. Jedenfalls weder von Ihnen unterstütztOptional
an der ZeitJavaConverters
wohl eine schönere syntax, aber das funktioniert nur von Scala-code, nicht aus Java-code konvertieren möchten Scala collections seit Java nicht unterstützt implicits. Es ist nichts falsch mitJavaConversions
scala.collection.convert
- Paket: stackoverflow.com/a/27110969/1809978. Es ist der richtige Weg, weil beide JavaConvertios und JavaConverters tatsächlich, es zu verwenden. und eigentlich sind DSLs für dieJavaConversions
von Java-code aus, aber du hast Recht, es nutzt implicits zu. Sie können tatsächlich nutzen es sowieso, durch den Aufruf explizit in diese Methoden, meine bad. Allerdings bin ich mir nicht sicher, ich bin stark kaufen das argument der blogger. Ich denke, in beiden Fällen werden Sie wissen, den Typ des zurückgegebenen Objekts, und Sie den Fall einfach überprüfen, indem er die Scala-compiler netter Typ-Inferenz-Funktion (in der Regel erfordern lediglich den Mauszeiger auf die variable, um zu sehen, seine Art, eine IDE -)option.getOrElse(null)
verkürzt werden kann, umoption.orNull
asJava
oderasScala
sagt, dass Sie die konkrete Art, die zurückgegeben wird. Sie wissen noch nicht, ob Sie werden am Ende mit einemArraylist
oder eineLinkedList
zum Beispiel. Nicht Sie haben zu prüfen, doc oder verwenden Sie die compiler-Inferenz in beiden Fällen, um zu bestimmen, die zugrunde liegende Typ ? Und selbst dann wird es nur geben Ihnen ein interface-Typ, nicht die wirklichen konkreten Typ. Trotzdem, vielen DankNone.getOrElse(null)
wirft eine NPE weilgetOrElse
nimmt einen by-name-argument, was übersetzt einescala.Function0
.Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_181). Type in expressions to have them evaluated. Type :help for more information. scala> Optional.ofNullable(None.getOrElse(null)) res4: java.util.Optional[Null] = Optional.empty
Es ist ein
asJava
Lösung jetzt! Es ist verfügbar auf2.10
.Beispiel:
Mehr details hier.
Können Sie auch einige der reichlich Dienstprogramme auf der github, z.B.:
https://gist.github.com/julienroubieu/fbb7e1467ab44203a09f
https://github.com/scala/scala-java8-compat
Ich bin, dies zu tun:
so, Sie können es verwenden, wie diese 🙂
Ab
Scala 2.13
es ist ein engagierter Konverter von scalaOption
zu javaOptional
.Von Java (die explizite Weg):
Von Scala (die implizite Weg):
Für eine gegebene Eingabe-parameter
opt: Option[T]
einige Klasse,definieren Sie eine Methode in dieser Klasse wie die folgenden:
def toOptional(implicit ev: Null <:< T): Optional[T] = Optional.ofNullable(opt.orNull)
.Andere nette lib:
https://github.com/AVSystem/scala-commons