2016-04-07 4 views
4

Optionen in Scala und Java sind etwas, das ich kämpfe, um zu verstehen und zu arbeiten. Ich verstehe es dort, um die "Null" -Behandlung der Hölle zu beseitigen. Ehrlich gesagt denke ich, dass es eine andere Art von Hölle einführt!Scala und Java-Optionen tun wenn vorhanden, wenn nicht etwas anderes konstruieren

Die Art, wie ich mit NULL-Werten in Java behandeln ist wie etwas zu tun:

String test = null; 
if(test==null) // do something 
else // do something else 

Diese Art der Entscheidung ist das, was ich suche zu tun, wenn ich auf Optionen wechseln.

Aber es gibt keine Methode in der Option-Klasse in beiden Scala und Java zu sagen, wenn null etwas tun, sonst etwas anderes tun.

Es gibt einen Weg, um den Wert im Falle unterliegen null, wie

//in scala 
test.getOrElse("defaulted") 

Ich frage mich, auf die Standard, warum es kippe Methoden sein wie die implizite Klasse ich geschrieben habe zu ‚pimpen‘ ein Scala Option

Bitte ignorieren Sie die schlecht benannte Methode. Aber mit diesem jetzt geschrieben, konnte ich angeblich eine Option wie folgt verwenden:

import Definitions._ 

val test : Option[String] = None 

var builder =new StringBuilder 


test.perform(builder ++= _,()=>addError("not found")) 
//or 
println(test.perform(_.reverse,()=>{"something else"})) 

def addError(error:String)={ 
    println(error) 
} 

Stattdessen bin ich gezwungen, Spiel und Fall zu schreiben alles für den Umgang mit Optionen zu tun. Ich muss etwas falsch machen. Höchstwahrscheinlich ist mein Verständnis der Verwendung von Optionen fehlerhaft. Die obige Art der Verarbeitung ist standardmäßig nicht in der Optionsklasse enthalten, und zwar aus einem Grund. Was könnte dieser Grund sein?

+1

Die Verwendung von 'Any' als Typ für Ihre Methoden (oder Methodenparameter) bringt Sie in eine echte Hölle (Sie verlieren die ganze Macht, die Ihnen das Typsystem bietet). Das heißt, die idiomatischste Art, eine "Option" -Instanz zu verwenden, besteht darin, sie als eine Sammlung oder Monade zu behandeln und "map", "flatMap", "filter" oder "foreach" zu verwenden. – jarandaf

+0

http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html Scrollen Sie nach unten zu "Tun Sie etwas, wenn Wert vorhanden ist" ... – Fildor

+2

Scala hat bereits 'fold', um dies zu tun:' test.fold (addError ("nicht gefunden")) (builder ++ = _) ' – Kolmar

Antwort

5

In scala gibt es, dass mehrere Wege zu erreichen:

  • optValue.map(successFunction).getOrElse(errorFunction)
  • optValue.fold(errorFunction)(successFunction)

wahrscheinlich das, was Sie wollen, ist die zweite, fold.

In Java gibt es eine .map, nicht sicher, ob es ein .fold, müssen Sie bei the docs

EDIT einen Blick haben: Wie Sie neue Zeilen in Falte haben gefragt, versuchen Sie mit Klammern:

+0

danke dafür. Die Kartenmethode sieht auch auf diese Weise nützlich aus. Mit der fold-Methode kann ich die Falte nicht schreiben (...) (...) als fold \ n (...) \ n (...)? In dem Sinne eine neue Zeile nach der Falte und nach jeder der Klammern für die Lesbarkeit. Meine IDE wird als Fehler angezeigt. – sethu

+0

versuchen mit geschweiften Klammern {}: 'Some (2) .fold { println ("error") } { Wert => println (s "Erfolg: $ value") }' – pedrorijo91

+0

Kommentare verlieren Zeilenumbrüche , Bearbeitung der Antwort – pedrorijo91

1

Ich denke, was Sie fehlen, ist der Grund warum Sie Optionen benötigen.

Die Idee hinter Optionen (und Optionals in Java) ist, dass Sie (der Entwickler) angeben, können nun, dass ein Wert kann oder nicht, auf der Typ-Ebene vorhanden sein kann.

Nehmen Sie sich eine Sekunde, um darüber nachzudenken. Wie würdest du das mit einer Variablen machen, die einfach null sein könnte?

...

Es ist ein Problem, oder?

  • Sie wissen nicht, ob es jemals null wäre, wenn Sie den Wert
  • Sie zu lesen bekommen muss immer überprüfen, ob es mit einer solchen Variable null ist, wenn Sie Ihren Code wollen sicher sein .

Aber jetzt, mit Optionen/Optionals, Sie und einige andere Entwickler, die mit Ihrem Code arbeiten jetzt durch der Compiler gesagt werden, dass sie die Möglichkeit prüfen müssen, dass diese Variable null sein wird (oder auch nicht !).

Wenn wir nun einen Schritt weiter gehen, stellen Sie sich vor, Sie schreiben Ihren gesamten Code so, dass jede Variable, die Null sein könnte, eine Option ist. Jede Variable, die niemals Null ist (wird immer einen Wert haben), ist nicht! Sie verstehen jetzt, oder?

Wenn Sie all Ihren Code so schreiben, werden Sie sich niemals versehentlich auf das Vorhandensein von Wert verlassen, der nicht da ist, noch unnötige Überprüfungen machen, ob der Wert da war, wann immer es ist! ;)

+1

Sie verpassen den OP-Punkt. Ich denke, er versteht das. Aber er möchte etwas tun, wenn die Option Keine ist, was nicht unangemessen ist. Map usw. erlaubt es Ihnen, etwas zu tun, wenn die Option etwas ist (und nichts tun, wenn es keine ist), aber wenn Sie etwas Bestimmtes zu tun haben, wenn es None ist (zum Beispiel eine Fehlermeldung anzeigen), wird das nicht so gut unterstützt . –

+0

meine Antwort basierte auf seiner: * "Ich muss etwas falsch machen. Höchstwahrscheinlich ist mein Verständnis der Verwendung von Optionen fehlerhaft." * Comment – gsaslis

+0

Antwortet immer noch nicht seine eigentliche Frage, die sich mit der None-Fall (siehe Betreff und die Frage am Ende) –

Verwandte Themen