스칼라의 콜렉션 객체에서 foldLeft을 많이 사용한다. 왼쪽 항부터 마지막 항까지 계산되는 것을 의미한다. 

리스트의 값을 왼쪽에서 오른쪽으로 계산한다. 0(초기값) + 3 + 6 + 9  = 18이 예상된다.

val list : List[Int] = List(3, 6, 9)
println(list.foldLeft(0) ((x, y) => x + y))

결과는 다음과 같다.


18



이 코드는 조금 아래처럼 잼나게 _+_로 바꿔 쓸 수 있다.  결과는 동일하다. 


val list : List[Int] = List(3, 6, 9)
println(list.foldLeft(0) (_+_))

동작이 어떻게 되는 지 궁금하다면 다음처럼 디버깅하듯이 코딩할 수 있다.

val list : List[Int] = List(3, 6, 9)
println(list.foldLeft(0) { (x : Int, y : Int) => println("x:"+ x + ",y:"+ y); x + y })


결과는 다음과 같다.


x:0,y:3

x:3,y:6

x:9,y:9

18








이제, foldRight 메소드를 사용한다.


val list : List[Int] = List(3, 6, 9)

println(list.foldRight(0) ((x, y) => x - y))


 


결과를 0으로 생각할 수 있겠지만, 사실 결과는 6이 출력된다.




출력할 수 있도록 println을 사용해본다.

val list : List[Int] = List(3, 6, 9)
println(list.foldRight(0) { (x : Int, y : Int)
=> println("x:"+ x + ",y:"+ y); x - y })


결과는 다음과 같다. 3 - (-3) = 6 이 된다. 


x:9,y:0

x:6,y:9

x:3,y:-3

6






문자열도 foldLeft도 사용할 수 있다. 


val list : List[String] = List("aaa", "bbb", "ccc")
list.foldLeft("xxx") { (x : String, y : String)
=> println("x: " + x + " y: " + y) ; x + ":" + y}


출력은 다음과 같다.


x: xxx y: aaa

x: xxx:aaa y: bbb

x: xxx:aaa:bbb y: ccc

Posted by '김용환'
,