2015-09-18 30 views
6

私はいくつかのメソッドを持っていますが、それぞれがオプションの文字列を返しています。どのようにして結合するのですか?結果を見つけるまで、javaは各メソッドを呼び出します。それぞれがJava8を返すカスケードメソッドオプション<>

私はこのようなもので終わるしたいのですが、orElseFlatMap()方法はありません:

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

結果が出たらすぐに短絡しますか?その場合は、単にメソッドの呼び出しをコンストラクトに入れることはできません。ラムダでコールをラップする必要があります(例えば 'orElseGet(() - > methodB() 'のように) –

+0

私はちょうど良い古いif-elseとnullsにとどまります:) – ZhongYu

答えて

0

あなたは基本的にあなたは自分の最初のメソッド呼び出しChain-of-responsibility patternような何かを行うことができますが。次に、結果を返すことができる場合は、最初のメソッドの内部でそれを返します。それが空の場合は、後継メソッドを呼び出します。

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

醜い:

+0

あなたの答えをありがとう。 – slartidan

4

あなたは、標準的な方法を使用すると、単一の式のソリューションを持つようにしたいと仮定すると、私はこれだけを思い付くことができます。あるいは、独自の静的メソッドを記述することもできます。

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

回避策の良い提案 - しかし、まだ私が探している "解決策"ではない... :(あなたの答えに感謝します。とにかく – slartidan

+1

@スラディダンの場合、おそらく結果をオプションとして保存する必要はありません。 'String result = methodA().ElseGet(() - > methodB().Else(whatEver));' –

+0

I OPがこのように2つ以上のメソッドをカスケードしたいと仮定します。このアプローチでは、カスケード構文の代わりにネストが行われます。 –

関連する問題