2016-04-07 3 views
0

こんにちは皆さんは、ラムダ式を使用せずにJSONObject.computeIfAbsentをどのように使用すればよいか知りたいです。 は実は、これは私が関数が私のカスタム例外をスローしたい私のコードラムダ式を使用しないでJSONObject.computeIfAbsentを使用する方法

list.computeIfAbsent(id, k -> { 
      try { 
       throw new UnknowClientException("Unkown client : Unable to find client with id" + id); 
      } catch (UnknowClientException e) { 

      } 
     }); 

です。私は関数のシグネチャにthowsを追加する必要があると仮定し、ラムダ式でそれを行うことを知らないので、なぜ "関数"を使いたいのですか?

答えて

1

ラムダ許可された例外のセットを変更しないので、通常のクラスに変換できます。実装されているinterfaceの宣言で許可された例外が決定されます。インタフェースの実装者は、すでに宣言されているインタフェースでカバーされていないthrows節にチェック例外を追加できません。

computeIfAbsent method inherited from the Map interfaceについて言えば、実装するメソッドはFunction.applyです。これはチェックされた例外を許可しません。

別の方法として、あなたは

result = Optional.ofNullable(list.get(id)).orElseThrow(() -> 
    new UnknowClientException("Unkown client : Unable to find client with id" + id)); 

提供Supplierを作成することを宣言し、そのUnknowClientExceptionがチェック例外である場合、呼び出し側はそれをキャッチまたは宣言する必要がありますどのようなスローするように宣言しOptional.orElseThrowジェネリックメソッドを使用することができますあなたの元の意図であると思われる。

+0

これは確かに、Javaのチェック例外の残念な結果の1つです。そのような理由から、私は常にRuntimeExceptionから自分の例外を継承しています。 :-P – Dolda2000

+0

こんにちは、私に役立つ代替ソリューションに感謝します!しかし、あなたは私にラムダと例外についての詳細を学ぶリンクを教えてもらえますか? –

関連する問題