Scala

Scala 부분 함수(PartialFunction)의 runWith, andThen

partner_jun 2017. 5. 10. 12:56

두 메소드는 모두 부분 함수(PartialFunction) 트레잇에 구현된 함수들이다. 따라서 PartialFunction 트레잇을 구현한 함수에서 사용할 수 있다. 심지어 위 메소드들이 반환하는 값이 부분 함수라는 점을 이용해 메소드 체이닝도 가능하다.


1. runWith 메소드

runWith는 함수의 apply를 수행하고 얻은 값을 Action 함수에 전달하는 새로운 함수를 만드는 메소드다. 만들어진 함수가 반환하는 값은 파라미터로 입력받은 값이 apply 함수를 호출할 수 있는지 여부에 해당하는 Boolean 값이다.


Scala의 Collection들은 PartialFunction Trait을 구현하고 있기 때문에 Collection에서도 사용이 가능하다. Map의 apply 함수는 Key를 입력받아 Value를 반환하므로 아래와 같은 결과를 얻는다.

val baseMap = Map[String, String] ( "Hello" -> "World",
"One" -> "1",
"Two" -> "2" )

val action: String => Unit = T => println(T) // String을 입력받아 화면에 출력하는 함수

val runWithFunction = baseMap.runWith(action) // Key가 존재하면 Value를 action 함수에 전달한다.



val result1 = runWithFunction("Hello") // "World"
println(result1) // true

val result2 = runWithFunction("No")
println(result2) // false


List의 runWith 메소드를 사용해 만들어지는 함수는 리스트 요소의 순서를 입력 받는 함수가 된다.

val lst = List(1,2,3,4,5)

val action: Int => Unit = T => println(T)

val runWithListFunction = lst.runWith(action)

println( runWithListFunction(1) ) // "2"
// true

println( runWithListFunction(100) ) // false




2. andThen 메소드

 runWith 메소드로 만들어진 함수는 원래 함수의 apply를 실행할 수 있었는지 여부인 Boolean 값만을 반환한다.

val action : String => String = T => T + "!"
val runWithFunction2 = baseMap.runWith(action)

println( runWithFunction2("Hello") ) // true
println( runWithFunction2("Six") ) // false

String => String 함수인 action을 파라미터로 만든 함수도 Boolean만을 반환한다.


만약 특정 자료형을 반환하는 함수를 만들어야 한다면 andThen 메소드를 사용해야 한다.

val baseMap = Map[String, String] ( "Hello" -> "World!",
"One" -> "1",
"Two" -> "2" )

val andThenBasemap = baseMap.andThen { // andThen은 부분 함수를 파라미터로 입력받는다.
x: String => x + "!!!"
}

println( andThenBasemap("Hello") ) // "World!!!!"
println( andThenBasemap("Six") ) // NoSuchElementException

예제에서 볼 수 있듯 andThen 메소드로 만들어진 함수는 apply 함수를 호출할 수 없는 파라미터를 입력 받으면 Exception이 발생한다.