모든 컬렉션 처리 메서드는 비용이 많이 든다. 표준 컬렉션 처리는 내부적으로 요소들을 활용해 반복을 도는데 내부적으로 계산을 위해 추가적인 컬렉션도 만들어 사용한다.
따라서 적절한 메서드를 활용해서 컬렉션 처리 단계 수를 적절하게 줄이는게 좋다
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도 비슷)
대부분 컬렉션 처리 단계는 전체 컬렉션에 대한 반복과 중간 컬렉션 생성이라는 비용이 발생한다. 이 비용은 적절한 컬렉션 처리 함수들을 활용해서 줄이자