반응형

이 게시물은 다음 링크를 참조하여 학습했습니다

 

Kotlin - Collections와 Sequences의 차이점

Java의 Collections는 Eager evaluation으로 동작합니다. Kotlin의 Sequences는 Java의 Stream처럼 Lazy evaluation으로 동작합니다. Lazy evaluation는 필요하지 않으면 연산을 수행하지 않기 때문에 더 적은 연산으로 동

codechacha.com

 

코틀린(Kotlin) Collections : 시퀀스(sequences)

코틀린(kotlin) 의 시퀀스(sequence) 를 살펴보자. 원문 https://kotlinlang.org/docs/reference/sequences.html 을 보며 정리. kotlin standard library 는 collection 과 함께 또다른 container type 인 s..

iosroid.tistory.com

 

Sequences | Kotlin

 

kotlinlang.org

 

Sequence methods · Kotlin Quick Reference

No results matching ""

kotlin-quick-reference.com

 

[Kotlin] 코틀린의 Iterator | choheeis

🙋🏻‍♀️ 프롤로그 자료구조 Linked List에 대해 공부한 후, 백준 - 1406 에디터 문제를 풀어봤다. 그런데 계속 시간초과가 나서 다른 사람들 코드를 보았더니 Stack으로 풀거나 Iterator를 사용해야

choheeis.github.io

 

Java Streams vs. Kotlin Sequences

Java streams are available to use in Kotlin when targeting JDK 8 or later for backend applications. A common question is whether to use…

proandroiddev.com

 

1. Iterable

Sequence에 대해 공부하면서 Iterable에 대해 알게 되었다. 

Collections에서 제공하는 줄 알았던 확장함수들이 사실은 Iterator가 제공한다는 것을 알게 되었다.....

이번 기회에 다시한번 얕게 배우면 안된다는 것을 느끼면서 내용을 정리하려 한다.

 

1-1. Iterator

Iterator는 Iterable의 상속자로부터 얻을 수 있다.

Iterator는 Collection에 해당하는 자료구조들의 원소들을 순회할 때 공통적으로 사용할 수 있다.

Iterator의 코드적인 내용은 아래 링크에 정리했다.

 

 

[Kotlin #3] Collections

이 게시물은 다음 링크를 참조하여 학습했습니다. Kotlin - Collections 소개 및 사용법 정리 (List, Map, Set) Collection(콜렉션)은 대부분의 프로그래밍 언어에서 지원하는 자료구조입니다. Collection은 List.

seminzzang.tistory.com

 

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

+ Recent posts