코틀린 인 액션에서 람다 파트에 아래와 같은 내용이 나옵니다

함수를 적재적소에 사용하라: count와 size

count가 있다는 사실을 잊어버리고, 컬렉션을 필터링한 결과의 크기를 가져오는 경우가 있다
>>> println(people.filter(canBeInClub27).size)
1

하지만 이렇게 처리하면 조건을 만족하는 모든 원소가 들어가는 중간 컬렉션이 생긴다. 반면 count는 조건을 만족하는 원소의 개수만을 추적하지 조건을 만족하는 원소를 따로 저장하지 않는다. 따라서 count가 훨씬 더 효율적이다.
...

 

/**
 * Returns the number of elements in this collection.
 */
@kotlin.internal.InlineOnly
public inline fun <T> Collection<T>.count(): Int {
    return size
}

그런데 코틀린 라이브러리를 보면 count가 size를 호출하는 인라인함수입니다

둘다 똑같은데 왜 효율적이라는거지? 하고 생각했는데

 

/**
 * Returns the number of elements matching the given [predicate].
 */
public inline fun <T> Iterable<T>.count(predicate: (T) -> Boolean): Int {
    if (this is Collection && isEmpty()) return 0
    var count = 0
    for (element in this) if (predicate(element)) checkCountOverflow(++count)
    return count
}

보니까 count 함수가 predicate를 인자로 받을 수 있습니다. 이 경우 filter까지 적용한 컬렉션을 따로 저장하지 않아도 되니 효율적이다 라는 거겠네요

 

people.filter(canBeInClub27).size  // no
people.count(canBeInClub27)  // yes

즉 위처럼 바꿔 쓰면 됩니다

반응형

'프로그래밍 > Kotlin' 카테고리의 다른 글

[Kotlin] flatMap, flatten  (0) 2022.04.02
[Kotlin] groupBy  (0) 2022.04.02
[Kotlin] 람다 (lambda)  (0) 2022.03.27
[Kotlin] Delegation (위임)  (0) 2022.03.27
[Kotlin] local function (로컬 함수)  (0) 2022.03.26