이 게시물은 다음 링크를 참조하여 학습했습니다
1. Iterable
Sequence에 대해 공부하면서 Iterable에 대해 알게 되었다.
Collections에서 제공하는 줄 알았던 확장함수들이 사실은 Iterator가 제공한다는 것을 알게 되었다.....
이번 기회에 다시한번 얕게 배우면 안된다는 것을 느끼면서 내용을 정리하려 한다.
1-1. Iterator
Iterator는 Iterable의 상속자로부터 얻을 수 있다.
Iterator는 Collection에 해당하는 자료구조들의 원소들을 순회할 때 공통적으로 사용할 수 있다.
Iterator의 코드적인 내용은 아래 링크에 정리했다.
2. Sequences
Sequences는 Iterable과 같은 기능을 제공한다. 하지만 여러 단계에 걸쳐 데이터를 처리할 때 다른 동작을 한다.
2-1. Eager evaluation vs Lazy evaluation
Eager evaluation은 우리말로 하면 "조급한 계산법",
Lazy evalutation은 "느긋한 계산법"이다.
갑자기 이게 왜 나오냐 싶을수도 있는데, Iterable과 Sequence의 가장 큰 차이점이 이것이다!
(1) Iterable
Iterable은 Eager evaluation으로 동작한다.
다음과 같이 filter, map, take를 걸쳐서 리스트를 얻으려고 할 때를 예로 들어보자.
val words = "The quick brown fox jumps over the lazy dog".split(" ")
val lengthsList = words.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("Lengths of first 4 words longer than 3 chars:")
println(lengthsList)
Eager evaluation은 수행해야 할 연산을 미루지 않고 바로 수행하는 방식이다.
모든 데이터에 대해 filter를 적용한 다음, map을 적용, take를 적용한다.
다이어그램으로 보면 아래처럼 동작한다.
(2) Sequences
Sequences는 Lazy evaluation으로 동작하게 되는데,
같은 코드를 예로 들어보자.
val words = "The quick brown fox jumps over the lazy dog".split(" ")
//convert the List to a Sequence
val wordsSequence = words.asSequence()
val lengthsSequence = wordsSequence.filter { println("filter: $it"); it.length > 3 }
.map { println("length: ${it.length}"); it.length }
.take(4)
println("Lengths of first 4 words longer than 3 chars")
// terminal operation: obtaining the result as a List
println(lengthsSequence.toList())
Lazy evaluation은 지금 하지 않아도 되는 연산은 최대한 뒤로 미루고, 연산이 꼭 필요한 순간에 연산을 하는 방식이다.
각 데이터에 대해 filter, map, take를 연속적으로 수행한다고 생각하면 된다.
다이어그램을 보면 아래처럼 동작한다.
3. Java Stream vs Kotlin Sequences
Kotlin Sequences는 Stream에 비해 다음에서 강점을 갖는다고 한다.
- Null Safety
- Readability & Simpliciity
- Performance Overhead
'Legacy' 카테고리의 다른 글
[Kotlin #9] lateinit, lazy (0) | 2022.05.24 |
---|---|
[Kotlin #8] Companion Object (0) | 2022.05.24 |
[Kotlin #6] 확장 함수(Extension Functions) (0) | 2022.05.23 |
[Kotlin #5] Inline Functions (0) | 2022.05.16 |
[Kotlin #4] Scope Functions (0) | 2022.05.16 |