2016-05-12 159 views
0

法官從編寫代碼的成語,高效的代碼等哪個編寫scala方法最好?

的角度來看,我有多種方式定義見下文得到getConf1,getConf2,或getConf3通過conf值的順序調用時,無論成功首先產生一個值。換句話說,如果getConf1產生一個值,我們將跳過剩下的兩個。如果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) 

}

def doConditionally[T1, T2](name: T1, list: List[(T1) => Option[T2]]): Option[T2] = { 
    list match { 
     case h::t => 
      val r = h(name) 
      if(r.isEmpty) { 
       doConditionally(name, t) 
      } else { 
      r 
      } 
     case Nil => 
     None 
    } 
} 

回答

11

鏈與orElse

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

注意getConf2getConf3只有來如果鏈是None當它達到他們(他們懶洋洋地評估)調用。

+4

你的意思是'getConf1(名稱),否則容易getConf2(名稱),否則容易getConf3(名稱)'。 – Jubobs

+1

是的。敬請諒解! :) – jkinkead

+0

我要說:美麗! – Mike

2

一個側面說明,找到第一個功能,提供了一個值,

Seq(getConf1 _, getConf2 _, getConf3 _).find(_("aName").isDefined)