2015-09-18 6 views
6

ich mehrere Methoden haben, dass jeder eine optionale Zeichenkette zurückkehren. Wie kombiniere ich dann, damit Java jede Methode aufruft, bis sie ein Ergebnis findet?Cascade Methoden, jede Rückkehr eine Java8 Optional <>

Ich möchte mit so etwas Ende, aber es ist nicht orElseFlatMap() Methode:

import java.util.Optional; 

public class OptionalCascade { 

    public static void main(String[] args) { 
     Optional<String> result = 

       // try to get a result with method A 
       methodA() 

       // if method A did not return anything, then try method B 
       .orElseFlatMap(methodB()); 
    } 


    static Optional<String> methodA() { 
     return Optional.empty(); 
    } 

    static Optional<String> methodB() { 
     return Optional.empty(); 
    } 
} 
+0

Möchten Sie kurzschließen, sobald Sie ein Ergebnis erhalten? In diesem Fall können Sie den Methodenaufruf nicht einfach in das Konstrukt einfügen. Du musst Anrufe in lambdas umhüllen (zB mit 'orElseGet (() -> methodB()' –

+0

Ich bleib einfach bei guten alten if-else und nulls :) – ZhongYu

Antwort

0

Sie so etwas wie ein Chain-of-responsibility pattern tun können, wo im Grunde Sie gerade Ihre erste Methode aufrufen. Dann innerhalb Ihrer ersten Methode, wenn Sie das Ergebnis zurückgeben und dann zurückgeben können. Wenn es leer ist, rufen Sie Ihre Nachfolgermethode auf.

+0

Danke für deine Antwort .Ich bin aber Suche nach einer Java8-Lösung in funktionaler Syntax zum Kombinieren meiner Optionals Ich möchte If/Else etc. vermeiden – slartidan

4

Angenommen, Sie Standardmethoden verwenden möchten, und Single-Ausdruck-Lösung, kann ich kommen nur mit diesem:

Optional<String> result = Optional.ofNullable(methodA().orElseGet(
     () -> methodB().orElse(null))); 

hässlich. Alternativ können Sie Ihre eigene statische Methode schreiben:

public static <T> Optional<T> orElseFlatMap(Optional<T> optional, 
     Supplier<Optional<T>> other) { 
    return optional.isPresent() ? optional : other.get(); 
} 

Optional<String> result = orElseFlatMap(methodA(),() -> methodB()); 
+0

Gute Vorschläge für Workarounds - aber immer noch nicht die "Lösung" Ich suche ... :(Danke für Ihre Antwort Wie auch immer, – slartidan

+1

@slartidan, wahrscheinlich müssen Sie das Ergebnis nicht als optional speichern.Verwenden Sie einfach 'String result = methodA() .oderElseGet (() -> methodB(). oderElse (whatever));' –

+0

I Angenommen, OP möchte auf diese Weise mehr als zwei Methoden kaskadie- ren. Dieser Ansatz führt zu einer Verschachtelung anstelle einer Kaskadensyntax. –

Verwandte Themen