2016-05-12 7 views
0

裁判官それを、効率的なコードこのスカラー法を書く最も良い方法はどれですか?など慣用的なコードを書くの観点から

私は以下に定義する複数の方法を持っているが、この順序で呼び出されたときに成功した最初の値を生成する方getConf1、getConf2、またはgetConf3からのconf値を取得します。つまり、getConf1が値を返す場合、残りの2つはスキップされます。 getConf1が値を返さない場合は、getConf2などを試します。

def getConf1(name: String): Option[String] 

def getConf2(name: String): Option[String] 

def getConf3(name: String): Option[String] 

アプローチ1:

def getSetting(name: String): Option[String] = { 
    var r = getConf1(name) 
    if(!r.isDefined) { 
     r = getConf2(name) 
    } 
    if(!r.isDefined) { 
     r getConf3(name) 
    } 
    r 

} 

アプローチ2:

def getSetting(name: String): Option[String] = { 
    val val1 = getConf1(name) 
    val val2 = getConf2(name) 
    val val3 = getConf3(name) 

    (val1, val2, val3) match { 
      case (a: Some[String], _, _) => a 
      case (_, a: Some[String], _) => a 
      case (_, _, a: Some[String]) => a 
      case _ => None 
    } 
} 

アプローチ3:

def getSetting(name: String): Option[String] = { 
val myList = List( 
    (n:String) => getVal1(n), 
    (n:String) => getVal2(n), 
    (n:String) => getVal3(n)) 

doConditionally(name, myList) 

}

答えて

11

チェーン:それは(彼らは遅延評価している)それらに到達したときにチェーンがNoneある場合getConf2getConf3だけと呼ばれるれることを

getConf1(name).orElse(getConf2(name)).orElse(getConf3(name)) 

注意。

+4

価値を提供する最初の関数を、見つけることができます。 – Jubobs

+1

はい。更新中! :) – jkinkead

+0

私は言うつもりです:美しい! – Mike

2

サイドノートでは、あなたが `getConf1(名)orElse getConf2(名)orElse getConf3(名)`意味

Seq(getConf1 _, getConf2 _, getConf3 _).find(_("aName").isDefined) 
関連する問題