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 값을 포함할 수 있는 제네릭 타입이고 T는 null 값을 포함하지 않는 타입이다.
- 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
반응형