코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

filter 함수

filter 함수는 리스트를 이터레이션하면서 리턴이 true 인 값만 필터링합니다.

var listInts = listOf(1,2,3,4)
//filter
listInts.filter { it % 2 == 0 }
//출력
[2,4]

map 함수

map 함수는 값을 변형해서 새로운 리스트를 생성합니다.

var listInts = listOf(1,2,3,4)
listInts.map { it * it }
//출력
[1,4,9,16]

val people = listOf(Person("A", 27), Person("B", 35), Person("C", 35))
listInts.map { it.name }
//출력
[A, B, C]
//심플한 방법
people.map(Person::name)

//30살이상의 이름 출력
people.filter { it.age >= 30 }.map(Person::name)

//가장 나이가 많은 사람들 모두 출력하기
//1. 최대값을 구하는 반복작업이 쓸데없이 많은 코드
people.filter { it.age == (people.maxBy(Person::age)!!.age) } //매번 maxBy 호출

//2. 계산이 중복되는것을 피하자. 람다안에 람다를 넣는것은 내부 로직을 매우 복잡하게 할 수 있음
val maxAge = people.maxBy(Person::age)!!.age //외부로 빼서 불필요한 반복 제거
people.filter { it.age == maxAge }

//맵 사용
//map 에는 filterKeys, mapKeys 와 filterValues, mapValues 함수가 있음
val numbers = mapOf(0 to "zero", 1 to "one")
val upperNumbers = numbers.mapValues { it.value.toUpperCase() }
//출력
[0=ZERO, 1=ONE]

all 함수

all 함수는 모든 원소가 람다식을 만족하는지 체크할 수 있습니다.

val people = listOf(Person("A", 27), Person("B", 35), Person("C", 35))
val canBeInClub27 = { p: Person -> p.age <= 27 }
people.all(canBeInClub27)

//출력
false //모든 값이 27 이하가 아니기때문에 false 출력

any 함수

any 함수는 하나라도 만족하는지 체크합니다.

val people = listOf(Person("A", 27), Person("B", 35), Person("C", 35))
val canBeInClub27 = { p: Person -> p.age <= 27 }
people.any(canBeInClub27)

//출력
true //A가 27 으로 하나라도 만족하기 때문에 true 출력

count 함수

count 함수는 람다식을 만족하는 개수를 리턴합니다.

people.count(canBeInClub27)
//출력
1 //27 이하는 한개

//filter 를 사용하면 중간 컬렉션이 불필요하게 생기때문에 count 가 효율적 임
people.filter(canBeInClub27).size 

find 함수

find 함수는 람다를 만족하는 하나를 찾을 수 있습니다.

// 27인 첫번째 것을 리턴하거나 없으면 null 을 리턴
people.find(canBeInClub27)

// find 에서 null 을 리턴한다는 것을 명확히 함
people.firstOrNull()

groupBy 함수

groupBy 함수는 조건에 따라 그룹으로 묶을 수 있습니다.

val list = listOf("A", "AB", "C")
list.groupBy(String::first).toString() //first가 같은 값으로 묶음

//출력
 {A=[A, AB], C=[C]}

flatMap 함수

flatMap 함수는 람다를 모든 객체에 적용하고 얻어지는 여러 리스트를 하나의 리스트로 생성합니다.

val strings = listOf("abc", "de")
strings.flatMap { it.toList() }
//출력
[a, b, c, d, e] //두개의 리스트가 한개 리스트로 합침

val strings = listOf("abc", "de", "de")
strings.flatMap { it.toList() }.toSet()
//출력
[a, b, c, d, e] //중복제거 O

//단순히 리스트를 펼치기만 할때
strings.map{ it.toList() }.flatten()
//출력
[a, b, c, d, e, d, e] //중복제거 X

위 코드에서 flatMap 안에 toList() 로 "a","b","c" 와 "d","e" 를 가진 리스트를 생성하고 이 두리스트를 합쳐서 "a,b,c,d,e" 값을 가진 리스트가 생성됩니다.

그러므로 리스트의 리스트가 있는 상황에서 중첩된 리스트의 원소를 한곳으로 모은 리스트가 필요한 경우 flatMap 을 사용할 수 있습니다.


*개인적으로 코틀린을 공부하면서 정리한 자료입니다. 수정 사항 및 이슈가 있는 경우 메일 부탁드립니다.

댓글

이 블로그의 인기 게시물

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기