두 메소드는 모두 부분 함수(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이 발생한다.
'Scala' 카테고리의 다른 글
Scala의 Symbol(심볼) (0) | 2017.05.15 |
---|---|
Scala와 Java에서 일반적인 파일 입출력 (0) | 2017.05.11 |
Scala, Map Collection의 withDefault, withDefaultValue 메소드 (0) | 2017.05.09 |
Scala의 Future의 map, for, recover (0) | 2017.04.16 |
Scala의 함수 커링(Currying)과 표현 (0) | 2017.04.14 |