기초개념/코틀린

코틀린 필터링 관련 함수

131 developer 2022. 5. 16. 11:08

 

List<String> 에서의 필터 사용

val dinnerList = listOf("Pizza", "Risotto", "Pasta", "Hamburger")

 

Filter

dinnerList.filter {
    it.startsWith("P")
}
// [Pizza, Pasta]

먼저 가장 기초가 되는 filter이다. Boolean 값에 따라 필터링을 할지 안 할지 결정한다. 위의 경우에는 “P”로 시작하는 항목만 true이고, 이 값들만 필터링된다.

 

FilterNot

dinnerList.filterNot {
    it == "Pizza"
}
// [Risotto, Pasta, Hamburger]

filterNot은 말 그대로 조건이 아닌 경우에만 남길 때 사용하는 함수이다. 가독성이 걱정될 때 적절히 사용하면 로직을 보기 좋게 정리할 수 있을 것이다.

 

FilterIndexed

dinnerList.filterIndexed { index, s ->
    index == 3
}
// [Hamburger]

인덱스를 통해 처리하고 싶을 때에는 filterIndexed를 통해 인덱스와 값을 각각 받을 수 있다.

 


List<Any?> 에서의 필터 사용

리스트에 null이 포함되어 있는 경우를 살펴보자.

val diNullList = listOf("Pizza", null, "Risotto", "Pasta", "Hamburger")

 

FilterNotNull

Notnull String에서 사용할 수 있는 it.startsWith("P") 와 같은 함수를 사용할 수 없어 컴파일되지 않을 것이다.

 

아래 예제는 간단한 예제이므로 it?.startsWith("P") ?: false 와 같이 사용할 수도 있지만, 필터를 통해 null값인 경우를 제외하고 시작할 수도 있다. filterNotNull 을 사용하면 null 값을 제외한 List를 반환받는다. 이 리스트를 가지고 다시 필터링 할 수 있다.

diNullList.filterNotNull().filter {
    it.startsWith("P")
}
// [Pizza, Pasta]

 

FilterIsInstance

Any? 리스트가 있을 때 역시 String에서만 사용하는 함수를 사용할 수 없다.

val diNullList = listOf("Pizza", null, "Risotto", 100, "Pasta", "Hamburger")

Int가 포함되어 있기 때문에 filter 안에서 if (it is String)과 같은 if문을 한번 거치게 된다. 매번 타입 체크를 하게 된다면 참 번거로운 일일테니 필터로 걸러주자.

diNullList.filterIsInstance<String>().filter {
    it.startsWith("P")
}

 

 

 

참고 

https://kotlinworld.com/12