컴비네이터란?
컬렉션을 변형한 후 동일한 자료형의 컬렉션을 반환하는 메소드
map(), foreach()
map()은 function을 이용해서 해당 컬렉션의 원소들을 변형시킨 후 새롭게 컬렉션을 만들어서 반환한다.
val list = List(2,4,6)
val minus_list = list.map(elem => elem - 1)
println(list) // Output : List(2,4,6)
println(minus_list) // Output : List(1,3,5)
foreach()는 map()과 마찬가지로 함수를 이용하지만 반환값이 없다.
var list = List(2,4,6)
list.foreach(elem => println(elem))
// Output
// 2
// 4
// 6
filter(), filterNot()
filter()는 function을 활용해서 해당 function의 결과값이 true인 요소만 모아서 새로운 컬렉션을 만들어 반환한다.
val oo = List(1,2,3)
val nn = oo.filter(i => i >= 3)
println(nn)
// Output List(3)
filterNot()은 filter와 반대 역할을 한다.
foldLeft(), foldRight(), partition()
fold의 의미인 '접다'처럼 왼쪽이나 오른쪽으로 요소를 접는 함수다.
두 개의 요소를 가져다가 하나로 만든다. 이를 최종적으로 하나의 값만 남을 때까지 반복한다.
val o = List(1,2,3,4)
val n = o.foldLeft(-1)((i,j)=>i+j)
println(n)
// Output 9
-1 + 1 + 2 + 3 + 4의 결과
foldRight()는 반대의 방향이다.
partition() 은 Boolean을 돌려주는 함수를 받아서 True인 요소와 False인 요소를 분리한다.
val o = List(1,2,3,4)
val n = o.partition(i => i > 3)
println(n)
// Output List(4), List(1,2,3)
:::() zip() unzip()
zip()은 ::: 과는 달리 튜플형태의 쌍으로 연결된 리스트를 돌려주고 unzip()은 zip()으로 묶어둔 리스트를 다시 풉니다.
val l1 = List(1,2,3)
val l2 = List(4,5,6)
val s1 = l1 zip l2
val s2 = l1 ::: l2
println(s1)
// Output List((1,4), (2,5), (3,6))
println(s2)
// Output List(1,2,3,4,5,6)
println(s1.unzip)
// Output (List(1, 2, 3),List(4, 5, 6))
특이한 점은 zip()은 짝이 안맞는 요소는 버린다는 것이다.
val l1 = List(1,2,3,4,5,6,7,8,9)
val l2 = List(10)
println(l1 zip l2)
// Output List((1,10))
find()
원하는 조건에 맞는 첫번째 요소를 Optional 형태로 반환한다.
val o = List(1,2,3,4)
println(o.find(i => i > 3))
// Output Some(4)
println(o.find(i => i > 10))
// Output None
drop(), dropWhile()
drop()은 인덱스를 받아서, 해당 인덱스까지의 모든 요소를 버린다.
dropWhile()은 조건식을 받아서 조건에 부합하는 요소를 모두 버린다. 단, 조건에 부합하지않는 요소가 하나라도 나타나면 그 즉시 중단한다.
val o = List(1,2,3,4,5,6,7,8)
val n = o.drop(4)
val nn = o.dropWhile(i => i > 3)
val nnn = o.dropWhile(i => i < 3)
println(n)
// Output List(5, 6, 7, 8, 9)
println(nn)
// Output List(1, 2, 3, 4, 5, 6, 7, 8, 9)
println(nnn)
// Output List(3, 4, 5, 6, 7, 8, 9)
flatten()
중첩된 리스트 등을 1차원으로 만들어주는 역할을 합니다.
val oo = List(1,2,3,4) :: List(5,6) :: Nil
val n = oo.flatten
println(n)
// Output List(1, 2, 3, 4, 5, 6)
================
이 글은 "누구나 쉽게 스칼라 + 플레이" 를 읽고 적었습니다.
한국인이 쓴 책이고 2016년 초판이라 읽기는 좋은데 중간중간 내용 오류가 있습니다. 그럼에도불구하고 '아예 초심자'가 감을 잡기에는 좋습니다. (가격이 비싼 건 흠입니다.)
'개발' 카테고리의 다른 글
[Scala] lazy val을 써야하는 경우 (0) | 2021.06.07 |
---|---|
[Scala] 순수함수와 참조투명성, 치환모형 (0) | 2021.06.07 |
2021 카카오 블라인드 공채 - 카카오 엔터프라이즈 후기 (8) | 2020.11.23 |
생애 첫 오픈 소스 풀 리퀘스트! (0) | 2020.09.15 |
2020 카카오 코딩 테스트 후기 (0) | 2020.09.13 |