컬렉션 처리는 내부적으로 계산을 위해 추가적인 컬렉션을 만들어 사용하며, 시퀀스 처리도 마찬가지로 조작을 위해 추가적인 객체를 만들어 낸다. 따라서, 컬렉션 처리 단계수를 적절히 제한하는것이 좋다.
일반적으로 컬렉션 처리와 관련해서 비효율적인 코드를 작성하는 이유는 어떤 메서드가 있는지 몰라서인 경우가 많다. 따라서, 상황에 따라 어떤 메서드가 있는지 확인을 미리 해보는것이 좋다.
fun List<Student>.getNames1(): List<String> = this.map { it.name }.filter { it != null }.map { it!! }
fun List<Student>.getNames2(): List<String> = this.map { it.name }.filterNotNull()
fun List<Student>.getNames3(): List<String> = this.mapNotNull { it.name }