Wie implementiert man diesen verschachtelten Fluss mit Optionals?

8

Ich habe eine Methode, die String als Eingabe verwendet und auch String zurückgibt.

Die folgende ASCII-Grafik zeigt den logischen Ablauf:

%Vor%

Im Grunde für gegebene input suche ich nach A Objekt, das in einem Option verpackt zurückgegeben wird. Dann ist A vorhanden Ich suche nach B - auch in Option eingepackt, sonst gib ERR_1 zurück. Wenn B vorhanden ist, gebe es id zurück, andernfalls gib ERR_2 zurück.

Ich frage mich, wie es mit Optionals (oder Pattern-Matching vielleicht?) in einer schönen und prägnanten Art und Weise (ohne ifology ) implementiert werden könnte - möglicherweise in One-Liner.

Könnte jemand bitte etwas vorschlagen?

Quellcode zum Ausprobieren finden Sie hier .

    
Opal 17.11.2016, 16:05
quelle

3 Antworten

5

Es sieht so aus, als hätten Sie 3 mögliche Ausgangspunkte:

  1. optA leer - & gt; "ERR_1"
  2. optA nicht leer & amp; & amp; optB leer - & gt; "ERR_2"
  3. beide nicht leer - & gt; optB.get () .gebot

Sie erreichen dies, indem Sie dies mit Javaslang tun:

%Vor%

Wenn optA leer ist, springen wir direkt zu orElse("ERR_1")

Wenn optA nicht leer ist, verwenden wir den Wert, der darin gespeichert ist, um den Wert b.bid oder "ERR_2" im Fall von optB Leerheit zu erhalten.

Auch in reinem Java 8 würde es so aussehen:

%Vor%     
Grzegorz Piwowarek 17.11.2016, 16:34
quelle
4

Da Sie javaslang verwenden, scheint Try eine bessere Wahl zu sein, da es den Fehler in der Kette weitergibt, während Option nur seine "Leere" propagiert.

Wenn Sie findA und findB ändern können, um Try zurückzugeben, erhalten Sie:

%Vor%

Wenn nicht, dann:

%Vor%

Das wird vorläufig B , ich bin mir nicht sicher, ob Sie den gültigen Wert und den Fehler auf den gleichen Wert reduzieren möchten, wenn das der Fall ist:

%Vor%

Wenn Sie ein Problem beim Erstellen von sinnlosen Ausnahmen haben, können Sie Either in jeder der Suchoperationen verwenden, wobei der linke Wert Ihr Fehlertyp ist. Das scheint das Problem besser zu modellieren, kann aber den Nachteil längerer Signaturen haben, je nachdem, wie Sie die Ausdrücke aufteilen.

    
Fred H. 17.11.2016 22:03
quelle
0

Sie möchten dies an Ihren Code anpassen, aber dies ist ein Ansatz, den ich verwenden würde.

Isolieren Sie zuerst die Fehler, die Sie für jeden Fehlerpunkt einkapseln möchten.

%Vor%

Dadurch können Sie später ein Lambda schreiben, um bei Bedarf eine spezifische Fehlermeldung anzuzeigen.

Jetzt schreiben wir die Optionals.

%Vor%

Um optB zu extrahieren, verwenden Sie dasselbe Muster wie für optA .

%Vor%     
Makoto 17.11.2016 16:23
quelle