2016-07-30 10 views
1

2つのオプションを扱うこのコードを書くのにもっと慣れて/簡単な方法がありますか?2つのオプションを評価するときの条件付きロジック

object Test extends App { 
    val colors = Some(1) 
    val sizes = Some(2) 

    val ids = colors match { 
    case None => { 
     sizes match { 
     case None => getRegularIds 
     case Some(sizes) => getSizeIds 
     } 
    } 
    case Some(colors) => { 
     sizes match { 
     case None => getColorIds 
     case Some(sizes) => getColorIds ++ getSizeIds 
     } 
    } 
    } 

    println(ids) 

    def getColorIds = Seq(1,2,4) 
    def getSizeIds = Seq(4,5,6) 
    def getRegularIds = Seq(7,8,9) 
} 

Scalaは非常に簡潔で、同じ結果を達成するためのよりクリーンな方法があると私は思っています。あなたの時間をありがとう。

答えて

2

ネストされたマッチングを避ける:

val ids2 = (colors, sizes) match { 
    case (None, None)  => getRegularIds 
    case (Some(_), None) => getColorIds 
    case (None, Some(_)) => getSizeIds 
    case (Some(_), Some(_)) => getColorIds ++ getSizeIds 
} 

あなたはまた、のような何かを試みることができる:あなたのSeq sがListのであれば、あなたも右の外に、Scalazの半群は、追加でこれを行うことができ

colors.fold(defaultColors)(_ => getColors) ++ 
    sizes.fold(defaultSizes)(_ => getSizes) 
+0

ありがとうございました。とても清潔です。 – user455497

+0

一方、ネストされたロジックは、より枝が浅くなるため、高速になります。 –

+0

@PaulDraperパフォーマンス向上の0.0000001%は保守性を上回るものではありません。 – ipoteka

0

をボックス:

import scalaz._, Scalaz._ 

scala> (colors.map(_ => getColorIds) |+| sizes.map(_ => getSizeIds)) 
     .getOrElse(getRegularIds) 
res11: List[Int] = List(1, 2, 4, 4, 5, 6) 

他の結果(e xplicitly)何が起こっているのか表示する:

scala> (Option(List(1, 2, 4)) |+| Option.empty[List[Int]]).getOrElse(getRegularIds) 
res14: List[Int] = List(1, 2, 4) 

scala> (Option.empty[List[Int]] |+| Option(List(4, 5, 6))).getOrElse(getRegularIds) 
res15: List[Int] = List(4, 5, 6) 

scala> (Option.empty[List[Int]] |+| Option.empty[List[Int]]).getOrElse(getRegularIds) 
res16: List[Int] = List(7, 8, 9) 

残念ながら、Semigroup[Seq]はありません。なぜそうではないかについてのより良い説明については、this answerを参照してください。

関連する問題