2017-10-18 3 views
2

最も内側のスコープに達していない場合に例外がスローされるようなラムダをいくつかネストしたいとします。これはどうすればできますか?ネストされたラムダが最も内側のスコープに到達できない場合に例外をスローする方法はありますか?

boolean someError = true; 

procA(new Object()).ifPresent(a -> { 
    procB(a).ifPresent(b -> { 
     System.out.println(a); 
     System.out.println(b); 

     // Can't do this: "Local variable someError in an enclosing scope must 
     // be final or effectively final" 
     someError = false; 
    }); 
}); 

if (someError) 
    throw new RuntimeException("Some error!"); 

これは私の他の質問に似ています:How to chain lambdas with all optional values available at the innermost scope without nesting Optional#ifPresent()?

違いはifPresent()を入れ子にすることは許可されていることです。 get()を使用することは、オプションのisPresent()の値がチェックされていない場合に実行時の例外が発生するのを避けるために、引き続き許可されていません。

答えて

0

私が徹底的にあなたがやろうとしていることに対して間違ったアプローチをしていると信じています。一般に、javaのメソッドがオプションを返すべきかどうかが議論されています。私はnullが完全に回避されているプロジェクトの場合にのみそれらをすべきだと考えています。

procAとprocBで正確に何が起こっているのかわからず、これをリファクタリングすることは非常に難しいです。私の推測では、procAとprocBの間のカプセル化と抽象化は理想的ではないということです。ここで

は、それが大きなリファクタリングすることなく動作させるかもしれないものである:

Optional<ReturnOfProcB> result = procA(paramA).map(this::procB); 
if(!result.isPresent()) { 
    throw new IllegalStateException(); 
} 
関連する問題