Betrachten Sie diese Situation, ich habe eine Reihe von Diensten, die alle die Eingabe überprüfen und Fehler behandeln müssen.Wie schreibe ich diese Funktion die Scala?
val log = Logger("access")
def service1(){input=>
try{
val id = input.split(",")(0).toInt
val value = input.split(",")(1)
//do something
} catch {
case e1: NumberFormatException => log.info("number format is wrong")
case e2: ArrayIndexOutOfBoundsException=> log.info("not enough arguments")
}
}
Ich möchte eine Methode schreiben, die dieses gemeinsame Teil für jeden Dienst behandelt. Ich könnte es auf diese Weise tun:
def common(input:String, log:Logger, action:(Int)=>String):String={
try{
val id = input.split(",")(0).toInt
val value = input.split(",")(1)
action(id)
} catch {
case e1: NumberFormatException => log.info("number format is wrong")
case e2: ArrayIndexOutOfBoundsException=> log.info("not enough arguments")
}
}
Dann wird die Service-Funktion wie folgt aussieht:
def service1(){input=> common(input, log, id=>{
//do something return a string
})
}
Gibt es eine Möglichkeit, die Parameter gemeinsam zu überspringen, so dass es elegantere wie Karte in einer Sammlung aussieht?
common(id=>{ //... })
Verwenden Sie sie als Tupel oder machen Sie Fallklasse, um zu erreichen, was Sie verlangen. es ist vielleicht eine der scala way, aber es ist nicht funktional Programmierung Weg.Wenn Sie für die funktionale Programmierung Weg suchen, müssen Sie von vorne beginnen (wie scalaz/Katzen entweder anstelle von String verwenden). Außerdem funktioniert Ihr Code nicht, wenn Ihr Aufruf eine Ausnahme außer "NumberFormatException" oder "ArrayIndexOutOfBoundsException" auslöst – suish