2016-07-25 20 views
0

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=>{ //... }) 
+0

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

Antwort

1
import com.typesafe.scalalogging.StrictLogging 


class MyService extends AbstractService { 
    def service1(input: String): String = common(input) { 
    id => 
     id.toString 
    } 

    def service2(input: String): String = common(input) { 
    id => 
     id.toString.toLowerCase 
    } 
} 

trait AbstractService extends StrictLogging { 

    def common(input: String)(f: Int => String): String = { 
    try { 
     val id = input.split(",")(0).toInt 
     f(id) 
    } catch { 
     case e1: NumberFormatException => 
     logger.error("number format is wrong",e1) 
     "" //??? 
     case e2: ArrayIndexOutOfBoundsException => 
     logger.error("not enough arguments",e2) 
     "" //??? 
    } 
    } 
} 

Wenn Eingang spezifisch haben Sie es als Eingabe zu setzen. Andernfalls definieren Sie die Methode def input:String im Merkmal und stellen Sie die Implementierung im Service bereit.

Verwandte Themen