study gomi

[kotlin/코틀린] 리스트 등의 컬렉션에서 null 값을 제거하는 방법 - filterNotNull() 본문

basic/kotlin

[kotlin/코틀린] 리스트 등의 컬렉션에서 null 값을 제거하는 방법 - filterNotNull()

공부하곰 2024. 12. 3. 16:05
728x90
반응형

filterNotNull()

  • Kotlin의 컬렉션 확장 함수 중 하나로 간단하지만 아주 강력한 기능을 제공한다.
  • 리스트 등 컬렉션에서 null 값을 제거해준다
  • 개인적으로 아주 유용하게 잘 쓰고 있다.

1. 역할

  • 정의: 리스트나 시퀀스에서 모든 null 값을 필터링하고 null이 아닌 요소들만 포함된 새 리스트를 반환한다.
  • 사용 상황: 컬렉션에 null 값이 포함될 가능성이 있고 이 값을 제외하고 작업해야 할 때 사용된다.
  • 예시
val listWithNulls: List<String?> = listOf("A", null, "B", null, "C")
val filteredList = listWithNulls.filterNotNull()

println(filteredList) // 출력: ["A", "B", "C"]

 

 

2. 작동 방식

fun <T : Any> Iterable<T?>.filterNotNull(): List<T> {
    return this.filter { it != null }
}
  • 내부적인 로직은 위와 같다 ↑
  • T?null 값을 포함할 수 있는 제네릭 타입이고 Tnull 값을 포함하지 않는 타입이다.
  • filterNotNull()은 컬렉션의 각 요소를 순회하며 it != null 조건에 맞는 요소만 필터링한다.
  • 결과적으로 null 값이 제거된 안전한 리스트만 남는다.

 

3. 효과

  • 코드의 안전성 개선
  • NullPointerException 방지: null 값을 미리 제거하므로 이후 로직에서 null을 처리하지 않아도 된다
  • 가독성 증가: filterNotNull()null 값 필터링을 한눈에 파악할 수 있다.

 

4. List 외의 사용 사례

(List 예시는 1번 설명에 예시로 들어가 있음)

  • Map의 Value에서 null 제거
val mapWithNulls: Map<Int, String?> = mapOf(1 to "One", 2 to null, 3 to "Three")
val nonNullValues = mapWithNulls.values.filterNotNull()

println(nonNullValues) // 출력: ["One", "Three"]

 

  • Sequence에서 사용
val sequenceWithNulls = sequenceOf("A", null, "B", null, "C")
val filteredSequence = sequenceWithNulls.filterNotNull().toList()

println(filteredSequence) // 출력: ["A", "B", "C"]

 

  • Custom Objects 필터링
data class User(val id: Int, val name: String?)

val users = listOf(User(1, "Alice"), User(2, null), User(3, "Bob"))
val nonNullNameUsers = users.filter { it.name != null }

println(nonNullNameUsers) // 출력: [User(id=1, name=Alice), User(id=3, name=Bob)]
728x90
반응형