[kotlin] filter, map, all, any, count, find, groupBy, flatMap 함수 정리

2020. 12. 17. 15:11모바일/Android_Kotlin

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))
people.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 을 사용할 수 있습니다.

출처 : https://zerogdev.blogspot.com/2019/07/kotlin-filter-map-all-any-count-find.html

'모바일 > Android_Kotlin' 카테고리의 다른 글

DataBinding – Two-way(양방향) Databinding with Custom View  (0) 2021.03.04
take  (0) 2020.12.17
[Kotlin] Sequence  (0) 2020.12.17
일급 시민, 일급 객체, 일급 함수  (0) 2020.12.03
Kotlin Class, 상속  (0) 2020.11.05