본문 바로가기

Dev Book/Kotlin IN ACTION

CH5(5.2). 컬렉션 함수형 API

1. filter와 map

- filter 함수는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다.

 

>>> val list = listOf(1,2,3,4)
>>> println(list.filter { it%2 == 0 })
[2,4]

 

- map 함수는 주어진 람다를 컬렉션의 각 원소에 적용한 결과를 모아서 새 컬렉션을 만든다.

 

>>>val list = listOf(1,2,3,4)
>>>println(list.map{ it*it })
[1,4,9,16]

2. all, any, count, find

- 컬렉션의 모든 원소가 어떤 조건을 만족하는지 판단하는 연산이다.

 

val canBeInClub27 = {p:Person -> p.age<=27}

>>> val people = listOf(Person("Alice", 27), Person("Bob", 31))
>>> println(people.all(canBeInClub27)) //모든 원소가 이 술어를 만족하는지
false

>>>println(people.any(canBeInClub27)) //이 술어를 만족하는 원소가 하나라도 있는지
true

>>println(people.count(canBeInClub27)) //술어를 만족하는 원소의 개수
1

>>println(people.find(canBeInClub27)) //조건을 만족하는 원소가 있다면, 처음 확인된 원소 반환. 없으면 null 반환.
Person(name=Alice, age=27)

3. groupBy

- 리스트를 여러 그룹으로 이루어진 맵으로 변경해준다.

 

>>>val people = listOf(Person("Alice",31),
	...Person("Bob", 29), Person("Carol", 31))
    
>>> println(people.groupBy{it.age})
[29=[Person(name=Bob, age=29)], 31=[Person(name=Alice, age=31), Person(name=Carol, age=31)]}

4. flatMap과 flatten

- flatMap 함수는 인자로 주어진 람다를 컬렉션의 모든 객체에 적용하고, 람다를 적용한 결과 얻어지는 여러 리스트를 한 리스트로 한데 모은다.

 

>>>val books = listOf(Book("book1", listOf("author1")), Book("book2", listOf("author2")), Book("book3", listOf("author2", "author3")))
>>>println(books.flatMap{ it.authors }.toSet())
[author1, author2, author3]

 

flatMap 함수는 모든 책의 작가를 평평한 리스트 하나로 모으고, toSet은 결과 리스트에서 중복을 없애 집합으로 만든다.

 

- 리스트의 리스트가 있는데 모든 중첩된 리스트의 우너소를 한 리스트로 모아야 한다면 flatMap을 사용할 수 있다. 하지만 특별히 변환해야 할 내용이 없다면 flatten 함수를 이용해 리스트의 리스트를 평평하게 펼치기만 하면 된다.