0
この状況を考えてみると、入力を確認してエラーを処理する必要があるサービスがたくさんあります。どのようにこの機能をスカラ方法を記述するのですか?
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")
}
}
すべてのサービスでこの共通部分を処理するメソッドを記述したいと思います。私は、このようにそれを行うことができます:
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")
}
}
そして、サービス機能は次のようになります。
def service1(){input=> common(input, log, id=>{
//do something return a string
})
}
は、それがコレクションにマップのような、よりエレガントに見えるように共通のパラメータをスキップする方法はありますか?
common(id=>{ //... })
タプルとして使用するか、ケースクラスを作成して、求めているものを達成します。関数型プログラミングの方法ではありませんが、最初からやり直す必要があります(文字列の代わりにscalaz/catsを使うなど)。あなたのコールバックが 'NumberFormatException'や' ArrayIndexOutOfBoundsException'以外の例外を投げた場合、あなたのコードは動作しません – suish