반응형

filter 함수

filter 함수는 컬렉션을 반복하면서 주어진 람다식에서 조건에 맞는(true로 반환되는) 원소만 모아주는 함수입니다.

filter함수를 사용한 결과는 입력 컬렉션의 원소들 중에서 조건에 맞는 원소들만으로 이루어진 새로운 컬렉션이 반환됩니다.

단, 입력 컬렉션에 영향을 주지는 않습니다.

 

아래의 예시들은 각각 입력 컬렉션에서 짝수만 출력하도록 filter를 사용한 것과

입력 컬렉션에서 5보다 작거나 같은 수들만 출력하도록 filter를 사용한 것입니다.

fun main(){

    val test = listOf(1, 2, 3, 4, 5, 6)
    
    // 입력 컬렉션(test) 중 짝수인 원소들만 출력
    println(test.filter { it % 2 == 0 }) // [2, 4, 6] 출력

    // 입력 컬렉션(test) 중 5보다 작거나 같은 원소들을 출력
    println(test.filter { it <= 5 }) // [1, 2, 3, 4, 5] 출력

    // 원본 컬렉션(test)에는 영향을 미치지 않습니다.
    println(test) // [1, 2, 3, 4, 5, 6] 출력

}

이름(String)과, 나이(Age)를 가지는 person이라는 데이터 클래스가 있고 people이라는 리스트에 person들이 담겨있습니다.

그중 filter을 사용하여 25살 이하의 사람들만 출력하도록 하는 예시입니다.

data class person(val name: String, val age: Int)

val people  = listOf<person>(
    person("지민", 20),
    person("민수", 22),
    person("미나", 30),
    person("현수", 25),
    person("인호", 19),
    person("인준", 26)
)

fun main(){

    // people을 출력
    println(people)
    // [person(name=지민, age=20), person(name=민수, age=22), person(name=미나, age=30),
    // person(name=현수, age=25), person(name=인호, age=19), person(name=인준, age=26)] 출력

    // 나이가 25살 이하인 사람들만 출력
    println(people.filter { it.age <= 25 })
    // [person(name=지민, age=20), person(name=민수, age=22), person(name=현수, age=25), person(name=인호, age=19)] 출력
	
}

이렇게 filter 함수는 컬렉션에서 조건에 맞지 않는 원소들을 제거(필터링)할 수 있습니다.

하지만, filter는 원소를 변화시킬 수는 없습니다. ex) 각 원소 * 2 등..

원소를 변환하기 위해서 map 함수를 사용하면 됩니다.

map 함수

map 함수는 각 원소를 원하는 형태로 변환하여 줍니다. 변환한 결과를 모아서 새 컬렉션을 만들어줍니다.

map 함수의 결과는 원본 컬렉션과 원소 개수는 같지만, 각 원소는 주어진 람다 함수에 따라서 변환된 새로운 컬렉션이 나오게 됩니다.

 

아래의 예시들을 각각 입력 컬렉션의 원소들에 * 2를 하도록 map을 사용한 것과

각 원소들을 제곱하도록 map을 사용한 것입니다.

fun main(){

    val test = listOf(1, 2, 3, 4, 5, 6)

    // 입력 컬렉션(test) 의 각 원소들을 * 2 시켜줌
    println(test.map{it * 2}) // [2, 4, 6, 8, 10, 12] 출력

    // 입력 컬렉션(test) 의 각 원소들을 제곱(^2) 시켜줌
    println(test.map { it * it }) // [1, 4, 9, 16, 25, 36] 출력

    // 원본 컬렉션에는 영향을 미치지 않습니다.
    println(test) // [1, 2, 3, 4, 5, 6] 출력

}

filter에서 예시로 든 이름(String)과, 나이(Age)를 가지는 person이라는 데이터 클래스가 있고 people이라는 리스트에 person들이 담겨있다고 할 때 filter 함수와 같이 사용하여 조건에 만족하는 사람들을 필터링하고 map 함수를 이용하여 이름만 출력하거나 나이만 출력하도록 할 수 있습니다.

data class person(val name: String, val age: Int)

val people  = listOf<person>(
    person("지민", 20),
    person("민수", 22),
    person("미나", 30),
    person("현수", 25),
    person("인호", 19),
    person("인준", 26)
)

fun main(){

    // 나이가 25살 이하인 사람들만 출력
    println(people.filter { it.age <= 25 })
    // [person(name=지민, age=20), person(name=민수, age=22), person(name=현수, age=25), person(name=인호, age=19)] 출력

    // 나이가 25살 이하인 사람들의 "이름"만 출력
    println(people.filter { it.age <= 25 }.map { it.name })
    // [지민, 민수, 현수, 인호] 출력

    // 나이가 25살 이하인 사람들의 "나이"만 출력
    println(people.filter { it.age <= 25 }.map { it.age })
    // [20, 22, 25, 19] 출력
}

all 함수, any 함수

all 함수는 컬렉션의 모든 원소가 조건을 만족하는지 판단하고 맞다면 true를 반환하고 하나라도 조건에 맞지 않으면 false를 반환합니다.

any 함수는 컬렉션의 원소 중 조건을 만족하는 원소가 하나라도 있는지 판단하고 맞다면 true를 반환하고 조건에 맞는 원소가 하나도 없으면 false를 반환합니다.

 

정리하면

all 함수는

컬렉션의 모든 원소가 조건을 만족하면 true를 반환,

하나라도 조건을 만족하지 않으면 false를 반환

 

any 함수는

컬렉션의 원소 중 조건에 만족하는 원소가 하나라도 있으면 true를 반환,

조건에 만족하는 원소가 하나도 없다면 false를 반환

data class person(val name: String, val age: Int)

val people  = listOf<person>(
    person("지민", 20),
    person("민수", 22),
    person("미나", 30),
    person("현수", 25),
    person("인호", 19),
    person("인준", 26)
)

fun main(){

    println(people.all { it.age >= 40 }) // false 출력
    println(people.all { it.age >= 20 }) // false 출력
    println(people.all { it.age >= 5 }) // true 출력

    println(people.any { it.age >= 40 }) // false 출력
    println(people.any { it.age >= 20 }) // true 출력
    println(people.any { it.age >= 5 }) // true 출력
}

count 함수

count 함수는 조건을 만족하는 원소의 개수를 정수형으로 반환해줍니다.

data class person(val name: String, val age: Int)

val people  = listOf<person>(
    person("지민", 20),
    person("민수", 22),
    person("미나", 30),
    person("현수", 25),
    person("인호", 19),
    person("인준", 26)
)

fun main(){

    println(people.count { it.age >= 40 }) // 0 출력
    println(people.count { it.name == "현수" }) // 1 출력
    println(people.count { it.age < 30 }) // 5 출력

}

find 함수

find 함수는 조건을 만족하는 첫 번째 원소를 반환하고, 조건을 만족하는 원소가 없다면 null을 반환합니다.

동일한 기능을 하는 firstOrNull 함수도 있습니다.

val people  = listOf<person>(
    person("지민", 20),
    person("민수", 22),
    person("미나", 30),
    person("현수", 25),
    person("인호", 19),
    person("인준", 26)
)

fun main(){

    println(people.find { it.age >= 40 }) // null 출력
    println(people.find { it.name == "현수" }) // person(name=현수, age=25) 출력
    println(people.find { it.age < 30 }) // person(name=지민, age=20) 출력

    println(people.firstOrNull { it.age >= 40 }) // null 출력
    println(people.firstOrNull { it.name == "현수" }) // person(name=현수, age=25) 출력
    println(people.firstOrNull { it.age < 30 }) // person(name=지민, age=20) 출력

}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기