8

入力として受け取るメソッドがあり、Stringまた を返す必要がありStringます。

次の ASCII アートは、論理フローを表しています。

Option<A> optA = finder.findA(input);

          optA
           /\
isEmpty() /  \ isDefined()  
         /    \
 "ERR_1"       Option<B> optB = finder.findB(optA.get().bid);
                      / \
           isEmpty() /   \ isDefined()
                    /     \
                "ERR_2"    opt2.get().id

基本的に、与えられた場合、にラップされて返されるオブジェクトをinput探しています。次に is is present 私が探している- ラップされたtoo 、そうでない場合は return . が存在する場合は ID を返し、そうでない場合は を返します。AOptionABOptionERR_1BERR_2

オプション(またはパターンマッチングでしょうか?)を使用して( ifologyなしで)素敵で簡潔な方法で、おそらくワンライナーで実装する方法を考えています。

誰でも何か提案してもらえますか?

試してみるソースコードはここにあります。

4

3 に答える 3

5

3 つの出口ポイントがあるようです。

  1. optA が空 -> "ERR_1"
  2. optA が空ではありません && optB が空です -> "ERR_2"
  3. どちらも空ではない -> optB.get().bid

Javaslang でこれを行うことで、これを実現できます。

 optA
   .map(a -> finder.findB(a.bid)
      .map(b -> b.bid)
      .getOrElse("ERR_2"))
   .getOrElse("ERR_1");

optAが空の場合、直接ジャンプしますorElse("ERR_1")

が空でない場合は、値を取得するため、または空の場合にoptA内部に格納されている値を使用しています。b.bid"ERR_2"optB

また、純粋な Java 8 では、次のようになります。

optA
  .map(a -> finder.findB(a.bid)
    .map(b -> b.bid)
    .orElse("ERR_2"))
  .orElse("ERR_1");
于 2016-11-17T16:34:02.850 に答える
0

これをコードに適応させたいと思うでしょうが、これは私が使用するアプローチです。

まず、カプセル化するエラーを障害点ごとに分離します。

Supplier<? extends RuntimeException> missingAException = IllegalStateException::new;
Supplier<? extends RuntimeException? missingBException = IllegalStateException::new;

これを行うと、後でラムダを記述して、必要に応じて特定のエラー メッセージを提供できます。

さて、オプションを書きます。

Optional<A> optA = finder.find(input);
Optional<B> optB = finder.findB(optA.orElseThrow(missingAException));

を抽出するoptBには、 で行ったのと同じパターンを使用しoptAます。

B value = optB.orElseThrow(missingBException);
于 2016-11-17T16:23:15.970 に答える