코틀린 인 액션에서 람다 파트에 아래와 같은 내용이 나옵니다
함수를 적재적소에 사용하라: 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 |