이펙티브 코틀린 Item 50: 컬렉션 처리 단계 수를 제한하라

woga·2024년 1월 7일
0

코틀린 공부

목록 보기
51/54
post-thumbnail

모든 컬렉션 처리 메서드는 비용이 많이 든다. 표준 컬렉션 처리는 내부적으로 요소들을 활용해 반복을 도는데 내부적으로 계산을 위해 추가적인 컬렉션도 만들어 사용한다.
따라서 적절한 메서드를 활용해서 컬렉션 처리 단계 수를 적절하게 줄이는게 좋다

ex)

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 }
 

보통 첫번째처럼 비효율적인 코드를 작성하는게 어떤 메서드가 있는지 몰라서 그렇다.

다양한 메서드들이 있으니 참고하자

  • filterNotNull()

  • mapNotNull { <Transformation> }

  • joinToString { <Transformation> }

  • filter{ <Predicate 1> && <Predicate 2> }

  • filterIsInstance<Type>)()

  • sortedWith(compareBy({ <Key 1> }, { <Key 2> }))

  • listOfNotNull(...)

  • filterIndexed { index, elem -> <Predicate using index }
    (map, forEach, reduce, fold도 비슷)

대부분 컬렉션 처리 단계는 전체 컬렉션에 대한 반복과 중간 컬렉션 생성이라는 비용이 발생한다. 이 비용은 적절한 컬렉션 처리 함수들을 활용해서 줄이자

profile
와니와니와니와니 당근당근

0개의 댓글