반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

안드로이드 개발자 노트

[이펙티브 코틀린] Item50. 컬렉션 처리 단계 수를 제한하라. 본문

Kotlin/이펙티브 코틀린

[이펙티브 코틀린] Item50. 컬렉션 처리 단계 수를 제한하라.

어리둥절범고래 2024. 2. 3. 19:39
반응형

모든 컬렉션 처리 메서드는 내부적으로 요소들을 활용해 반복을 돌며, 내부적으로 계산을 위해 추가적인 컬렉션을 만들어 사용합니다.

시퀀스 처리도 시퀀스 전체를 랩하는 객체가 만들어지며, 조작을 위해서 또 다른 추가적인 객체를 만들어 냅니다.

요소의 수가 많다면, 큰 비용이 들어갈 수 있으므로, 컬렉션 처리 단계 수를 적절하게 제한하는 것이 좋습니다.

어떤 메서드를 사용하는지에 따라 컬렉션 처리의 단계 수가 달라집니다.

class Student(val name: String?)

// 작동은 한다.
fun List<Student>.getNames(): List<String> = this
    .map { it.name }
    .filter { it != null }
    .map { it!! }

// 더 좋다.
fun List<Student>.getNames(): List<String> = this
    .map { it.name }
    .filterNotNull()

// 가장 좋다.
fun List<Student>.getNames(): List<String> = this
    .mapNotNull { it.name }

다음 표는 두 단계 이상의 컬렉션 처리 함수를 한번에 끝내는 방법을 정리한 것입니다.

 

 

이 코드보다는 이 코드가 좋다.
.filter { it != null }
.map { it!! }
.filterNotNull()
.map { <Transformation> }
.filterNotNull()
.mapNotNull { <Transformation> }
.map { <Transformation> }
.joinToString()
.joinToString { <Transformation> }
.filter { <Transformation1> }
.filter { <Transformation2> }
.filter {
    <Predicate 1> && <Predicate 2> }
.filter { it is Type }
.map { it as Type }
.filterIsInstancec<Type>()
.sortedBy { <Key 1> }
.sortedBy { <Key 2> }
.sortedWith(
    compareBy({ <Key 1> }, { <Key 2> }))
listOf(...)
.filterNotNull()
listOfNotNull(...)
.withIndex()
.filter { (index, elem) ->
<Predicate using Index> }
.map { it.value }
.filterIndexed { index, elem ->
<Predicate using Index> }

(map, forEach, reduce, fold도 비슷하다.)

 

반응형