2016-05-12 3 views
0

Судите его с точки зрения написания кода идиоматического, эффективный код и т.д.Каков наилучший способ написать этот метод scala?

У меня есть несколько способов, определенные ниже получить значение конфа от getConf1, getConf2, или getConf3 какой успешно возвращающего значения первым при вызове в таком порядке. Другими словами, если 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)) 

Обратите внимание, что getConf2 и getConf3 будет только можно назвать, если цепь None, когда он достигает их (они лениво оценивали).

+4

Вы имеете в виду 'getConf1 (имя) OrElse getConf2 (имя) OrElse getConf3 (имя)'. – Jubobs

+1

Да. Обновление! :) – jkinkead

+0

Я собираюсь сказать: Красиво! – Mike

2

Примечание стороны, чтобы найти первую функцию, которая обеспечивает значение,

Seq(getConf1 _, getConf2 _, getConf3 _).find(_("aName").isDefined) 
Смежные вопросы