2016-09-13 7 views
1

内側の設定項目のフィールド値に基づいてtrueまたはfalseを返す必要があります。Scalaのdouble foreachの解除

myChoice.category.foreach(category => { 
    category.flavours.foreach(flavour=> { 
    if (flavour.available) true 
    }) 
}) 
false 
それが壊れshoudld

に従うと、私は利用可能で、真の持っているが、そのが偽のすべての時間を返すとすぐにtrueを返しとして私のループがあります。なにか提案を?

答えて

6

データセットがありませんが、おそらくこれが原因です。

myChoice.category.exists(_.flavours.exists(_.available)) 
3

Scalaはcontinuebreakを持っていません。完全に機能する言語であるため、すべての式(ループを含む)には値が必要です。さらに、変数を初期化し、ループの過程で変数を変更するという命令的スタイルから脱却しようとします。代わりに、スカラは機能的スタイルを使用することを奨励します。つまり、データ構造全体に適用されるメソッドを使用して、目的の結果を変換/検索します。

あなたのケースでは、availableフィールドがtrueに設定されているフレーバーがあるかどうかは明らかです。したがって、あなたはブールのリストに全体のネストされたコレクションをflatMap、およびコレクション全体のorを取ることができる:

val anyAvaliable = myChoice.category.flatMap(a => a.flavours).reduce((flavour1,flavour2) => flavour1.available || flavour2.available) 

jwvhのソリューションは、より簡潔です。本質的に同じことを達成する多くの方法があります。言語と戦わないで、あなたのために戦いましょう!

1

免責事項:以下の解決策は完全性のために提供されていますが、この場合はjwvhの回答が優先されるべきであり、一般的により良い選択肢があります。特に、ラムダ内部のreturnが例外を使って実装されていることに注意してください.1)通常のメソッド呼び出しよりもはるかに悪い可能性があります。 2)あなたが不注意であれば、それを間違えて捕まえることができます。

これはあなたが方法で行う必要がある最後の事であるならば、あなただけのreturnを使用することができます。

myChoice.category.foreach(category => { 
    category.flavours.foreach(flavour=> { 
    if (flavour.available) return true 
    }) 
}) 
false 

されていない場合、あなたは(ローカル1を含む)メソッドを抽出することができます。

def foo = { 
    ... 

    val myChoice = ... 

    def hasAvailableFlavorsMethod() = { 
    myChoice.category.foreach(category => { 
     category.flavours.foreach(flavour=> { 
     if (flavour.available) return true 
     }) 
    }) 
    false 
    } 

    val hasAvailableFlavors = hasAvailableFlavorsMethod() 

    ... 
} 
関連する問題