<FP 기법>
1. carry Over : tail recursive 처럼 결과값을 계속 넘기는 방식. (carry Over: 그냥 영어임.)
2. predicate : 함수는 f()로 표현. Boolean을 리턴하는 함수는 predicate 이라고 부름.
(이것도 scala에선 그냥 영어임. java엔 Predicate존재)
=> p()를 이용해 함수 input param들을 필터처럼 거를 수 있음
<FP기법 예제 - 1.carryOver>
object Main{
def total(list: List[Int]) = { //기존 sum함수
var sum = 0
for (i <- list) { sum += i }
sum
}
def totalFP(list:List[Int]) = { //부분합을 계속 넘기면서 합을 해나가는 방식. foldLeft함수가 첫번째 param으로 carryOver로 계속 받아 주면서 iterate를 제공.
list.foldLeft(0) { (carryOver,v) => carryOver + v }
}
def main(args:Array[String]) = {
println(totalFP(List(1,2,3,4,5)))
}
}
<FP기법 예제 - 2.Predicate>
def totalFP(list:List[Int] , p:Int => Boolean) = {
list.foldLeft(0) { (carryOver,v) => if (p(v)) carryOver + v else carryOver }
}
def main(args:Array[String]) = {
println(totalFP(List(1,2,3,4,5),{ v => v % 2 == 0 })) //짝수인 2,4 만 적용되서 합이 6 이 나옴.
}
추가적으로 v => v > 4 같은 predicate은 _ > 4 로 표시 가능
그리고 아래 3가지들이 scala에서 좀 특별하다.
trait - java의 Interface와 비슷하지만, class특성도 지님.
<trait특성 >
- extends 로도 with 로도 사용가능하다. 심지어는 구현body가 존재해도 된다.
- with의 경우에는 여러가지 trait가 사용가능하며, with A, with B의 경우 B가 먼저 적용된다.
- override abstract라는 키워드를 사용하여 기존 def를 추상화하여 사용할 수도 있다.
- Class 가 아니고 인스턴스에도 사용가능 : with Friends
xml - xml이 1등급 고객임. "" 필요없음
actor - thread + 큐 : 수천개의 actor를 만들어도 된다
자세한 건 여기클릭: hillarious indian guy