interface Sequence<out T>
μνμ€μ iteratorλ₯Ό ν΅ν΄ κ°λ€μ λ°ννλ€. κ°λ€μ lazily νκ² κ³μ°λκ³ , μνμ€λ μ μ¬μ μΌλ‘ 무ννκ² κ°μ λ£μ μ μλ€.
μνμ€λ μ¬λ¬λ² λ°λ³΅λ μ μμ§λ§ λͺλͺ μνμ€ κ΅¬νλ€μ ν λ²λ§ λ°λ³΅λλλ‘ μ μ΄νλ€. νμμ μνμ€λ λ λ² λ°λ³΅μ μλν λ exceptionμ λ°μμν¨λ€.
interface Iterable<out T>
Iterable μΈν°νμ΄μ€λ₯Ό μμνλ ν΄λμ€λ€μ λ°λ³΅ κ°λ₯ν μΌλ ¨μ μμλ€λ‘μ ννλ μ μλ€.
kotlinlang.org/docs/sequences.html#from-a-function
kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/-sequence/
collenctionsμ ν¨κ», μ½νλ¦° standard libraryλ sequence(Sequence <T>)λΌλ λ λ€λ₯Έ container νμ μ κ°μ§κ³ μλ€.
μνμ€λ Iterableκ³Ό κ°μ ν¨μλ€μ μ 곡νλ, multi-step collection(λ€λ¨κ³ μμ§) μ²λ¦¬μ λ λ€λ₯Έ μ κ·Όλ°©λ²μ ꡬννλ€.
Iterableμ μ²λ¦¬λ μ¬λ¬ λ¨κ³λ€μ ν¬ν¨ν λ, κ·Έ λ¨κ³λ€μ μ΄μ¬ν μ²λ¦¬λλ€. κ° μ²λ¦¬ λ¨κ³κ° μλ£νκ³ μ€κ° 컬λ μ
μΈ κ²°κ³Όλ₯Ό λ°ννλ€. λ€μ λ¨κ³λ μ΄ μ€κ° 컬λ μ
μ μννλ€. μνμ€μ μ¬λ¬ λ¨κ³ μ²λ¦¬λ κ°λ₯ν λ κ²μΌλ₯΄κ² μ€νλλ€. μ€μ κ³μ°μ μ 체 νλ‘μΈμ€ 체μΈμ κ²°κ³Όκ° μμ²λ λμλ§ μΌμ΄λλ€.
μ°μ° μ€ν μμλ λ€λ₯΄λ€. Sequenceλ λͺ¨λ νλμ μμλ§λ€ λͺ¨λ μ²λ¦¬ λ¨κ³λ₯Ό ν λ¨κ³μ© μννκ³ , Iterableμ μ 체 collectionμ κ° λ¨κ³λ₯Ό μλ£νκ³ λ€μ λ¨κ³λ‘ μ§ννλ€.
κ·Έλμ μνμ€λ μ€κ° λ¨κ³μ κ²°κ³Όλ¬Ό μμ±μ νΌνκΈ° λλ¬Έμ μ 체 μ½λ μ
μ²λ¦¬ 체μΈμ μ±λ₯μ μ¦κ°μν¨λ€.
κ·Έλ¬λ μνμ€μ κ²μΌλ₯΄λ€λ νΉμ±μ΄ λ μμ μ½λ μ
μ μ²λ¦¬νκ±°λ λ κ°λ¨ν κ³μ°μ ν λ μλΉν μ€λ²ν€λλ₯Ό λ§λ λ€.
λ°λΌμ Sequenceμ Iterableμ λμμ κ³ λ €ν΄ μν©μ λ°λΌ μ΄λ κ²μ΄ λ λμμ§ κ²°μ ν΄μΌ νλ€.
μμ±
μμλ€λ‘
sequnceOf() ν¨μλ‘ μμλ€μ 맀κ°λ³μλ€λ‘ λμ΄νλ€.
val numbersSequence = sequenceOf("four", "three", "two", "one")
fun <T> sequenceOf(vararg elements: T): Sequence<T>
μ§μ λ κ°μ λ°ννλ μνμ€λ₯Ό μμ±νλ€.
Iterableλ‘
μ΄λ―Έ Iterable κ°μ²΄(List, Set λ±)λ₯Ό κ°μ§κ³ μλ€λ©΄ asSequence()λ₯Ό νΈμΆνλ€.
val numbers = listOf("one", "two", "three", "four")
val numbersSequence = numbers.asSequence()
asSequence
fun <T> Array<out T>.asSequence(): Sequence<T>
fun ByteArray.asSequence(): Sequence<Byte>
fun ShortArray.asSequence(): Sequence<Short>
fun IntArray.asSequence(): Sequence<Int>
fun LongArray.asSequence(): Sequence<Long>
fun FloatArray.asSequence(): Sequence<Float>
fun DoubleArray.asSequence(): Sequence<Double>
fun BooleanArray.asSequence(): Sequence<Boolean>
fun CharArray.asSequence(): Sequence<Char>
fun <T> Iterable<T>.asSequence(): Sequence<T>
fun <K, V> Map<out K, V>.asSequence(): Sequence<Entry<K, V>>
ν¨μλ‘
generateSequnce()λ₯Ό νΈμΆν΄ ν¨μμ κΈ°λ°ν μνμ€λ₯Ό μμ±νλ€. 맀κ°λ³μλ‘ ν¨μλ₯Ό λ£λλ€. μ νμ μΌλ‘, 첫 μμλ λͺ μμ μΈ κ°μ΄λ ν¨μ νΈμΆ κ²°κ³Όλ‘ μ§μ ν μ μλ€. μ 곡λ ν¨μκ° nullμ 리ν΄ν λ μνμ€ μμ±μ΄ μ€μ§λλ€.
generateSequence
fun <T: Any> getnerateSequence(
nextFunction: () -> T?
): Sequence<T>
nextFunctionμ΄ nullμ λ°νν λκΉμ§ κ° iterationμμ λ€μ κ°μ κ³μ°νλ nextFunctionμ νΈμΆνλ μνμ€λ₯Ό λ°ννλ€.
fun <T: Any> generateSequence(
seed: T?,
nextFunction: (T) -> T?
): Sequence<T>
seed κ°μ μμ nextFunction ν¨μμ μμνλ κ°μΌλ‘ μ μνκ³ , nextFunctionμ΄ nullμ λ°νν λκΉμ§ κ° iterationμμ λ€μ κ°μ κ³μ°νλ nextFunctionμ νΈμΆνλ μνμ€λ₯Ό λ°ννλ€.
fun <T: Any> generateSequence(
seedFunction: () -> T?,
nextFunction: () -> T?
): Sequence<T>
μλ μμ μ μνμ€λ 무νλμ΄λ€.
fun main() {
val oddNumbers = generateSequence(1) { it + 2 } // `it` is the previous element
println(oddNumbers.take(5).toList())
//println(oddNumbers.count()) // error: the sequence is infinite
}
κ²°κ³Ό
[1, 3, 5, 7, 9]
μ νν μνμ€λ₯Ό generateSequence()λ‘ μμ±νκΈ° μν΄μλ μ 곡νλ ν¨μκ° λ§μ§λ§ μμ λ€μ nullμ λ°ννλλ‘ νλ€.
fun main() {
val oddNumbersLessThan10 = generateSequence(1) { if (it < 8) it + 2 else null }
println(oddNumbersLessThan10.count())
}
κ²°κ³Ό
5
chunckλ‘
sequence() ν¨μλ‘ μμμ ν¬κΈ°μ chunck(λ©μ΄λ¦¬)λ€μ μμ νλμ© μνμ€ μμλ‘ μμ±ν μ μλ€. μ΄ ν¨μλ yield()μ yieldAll() ν¨μλ€μ ν¬ν¨νλ λλ€ ννμμ μ¬μ©νλ€. μ΄ yield()μ yieldAll()μ μνμ€ consumerμ μμλ₯Ό λ°ννκ³ consumerκ° λ€μ μμλ₯Ό μμ²ν λκΉμ§ sequence() μ€νμ μ€λ¨νλ€. yield()λ 맀κ°λ³μλ₯Ό νλλ§ μ΄λ€. yieldAll()μ Iterable κ°μ²΄, Iterator, μλλ©΄ λ€λ₯Έ μνμ€λ₯Ό 맀κ°λ³μλ‘ μ΄λ€. yieldAll()μ μνμ€ λ§€κ°λ³μλ 무νν μ μλ€. κ·Έλ¬λ μ΄λ° νΈμΆμ 맨 λ§μ§λ§ μμμ¬μΌ νλ€. λ€λ₯Έ νμ νΈμΆλ€μ΄ μ€νλμ§ μμ μ μκΈ° λλ¬Έμ΄λ€.
fun main() {
val oddNumbers = sequence {
yield(1)
yieldAll(listOf(3, 5))
yieldAll(generateSequence(7) { it + 2 })
}
println(oddNumbers.take(5).toList())
}
κ²°κ³Ό
[1, 3, 5, 7, 9]
kotlin-stdlib/kotlin.sequences/SequenceScope
abstract suspend fun yield(value:T)
μμ±μ€μΈ(being built) Iteratorμ valueλ₯Ό μ 곡νκ³ λ€μ valueκ° μμ²λ λκΉμ§ μΌμ μ€λ¨νλ€.
abstract suspend fun yieldAll(iterator: Iterator<T>)
iteratorλ‘λΆν° λͺ¨λ κ°λ€μ΄ λ°λ³΅λκ³ λ€μ κ°μ΄ μμ²λ λκΉμ§ μμ±λκ³ μ€λ¨ν Iteratorλ‘ λͺ¨λ κ°λ€μ μ°μΆνλ€.
suspend fun yieldAll(element: Iterable<T>)
iteratorλ‘λΆν° λͺ¨λ κ°λ€μ΄ λ°λ³΅λκ³ λ€μ κ°μ΄ μμ²λ λκΉμ§ μμ±λκ³ μ€λ¨ν Iteratorλ‘ κ°λ€μ collection νλλ₯Ό μ°μΆνλ€.
suspend fun yieldAll(sequence: Sequence<T>)
iteratorλ‘λΆν° λͺ¨λ κ°λ€μ΄ λ°λ³΅λκ³ λ€μ κ°μ΄ μμ²λ λκΉμ§ μμ±λκ³ μ€λ¨ν Iteratorλ‘ κ°λ€μ΄ 무νλμΌ μ μλ μνμ€λ₯Ό μ°μΆνλ€.
μνμ€ μμ
μνμ€ μ°μ°(μμ )μ μν μꡬμ¬νμ λ°λΌ μλμ κ·Έλ£Ήλ€λ‘ λΆλ₯ν μ μλ€.
- Stateless μ°μ°λ€μ μνλ₯Ό νμλ‘ νμ§ μκ³ κ° elementλ₯Ό λ 립μ μΌλ‘ μ²λ¦¬νλλ°, μλ₯Ό λ€μ΄μ, map() λλ filter()κ° μλ€. Stateless μ°μ°λ€μ΄ elementλ₯Ό μ²λ¦¬νλλ° μΌμ λμ stateκ° νμν μλ μλ€. μλ₯Ό λ€λ©΄ take(), drop()μ΄ μλ€.
- State μ°μ°λ€μ μλΉλμ μνλ₯Ό μꡬνλλ°, λκ° μνμ€μ elementμ μμ λΉλ‘νλ€.
λ§μ½ μνμ€ μ°μ°μ΄ λ€λ₯Έ μνμ€λ₯Ό lazily νκ² μμ±ν΄ λ°ννλ€λ©΄, intermediateλΌκ³ λΆλ¦°λ€. λ€λ₯Έ κ²½μ°μ μ΄ μ°μ°μ terminalμ΄λ€. terminal μ°μ°μ μλ‘λ toList()μ sum()μ΄ μλ€. μνμ€ μμλ€μ terminal μ°μ¬λ€μμλ§ λ°μμ¬ μ μλ€.
μνμ€λ€μ μ¬λ¬ λ² λ°λ³΅λ μ μμΌλ λͺλͺ μνμ€ κ΅¬νλ€μ ν λ²λ§ λ°λ³΅λλλ‘ μ ννλ€.
Iterable
λ¨μ΄ 리μ€νΈλ₯Ό κ°μ§κ³ μλ€κ³ ν΄λ³΄μ. μλμ μ½λλ κΈμ μκ° 3μ λμΌλ©΄ λ¨μ΄λ₯Ό νν°λ§νκ³ νν°λ§λ λ¨μ΄μ 첫 4κ°λ§ κΈΈμ΄λ₯Ό μΆλ ₯νλ€.
fun main() {
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)
}
κ²°κ³Ό
filter: The
filter: quick
filter: brown
filter: fox
filter: jumps
filter: over
filter: the
filter: lazy
filter: dog
length: 5
length: 5
length: 5
length: 4
length: 4
Lengths of first 4 words longer than 3 chars:
[5, 5, 5, 4]
μ΄ μ½λλ₯Ό μ€νν λ, filter()μ map() ν¨μκ° μ½λμμ λνλ μμλλ‘ μ€νλλ κ²μ λ³Ό μ μλ€. μ²μμ, λͺ¨λ μμλ€μ΄ filterλ₯Ό κ±°μΉκ³ , νν°λ§μ κ±°μΉ λ¨μ΄λ€μ΄ lengthλ₯Ό μ§λ, λ§μ§λ§ λ μ€μ μΆλ ₯μ΄ λμ¨λ€.
리μ€νΈκ° μ΄λ»κ² μ²λ¦¬λλμ§λ λ€μκ³Ό κ°λ€.
Sequence
μνμ€λ‘ λκ°μ΄ μμ±ν μ μλ€.
fun main() {
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())
}
κ²°κ³Ό
Lengths of first 4 words longer than 3 chars
filter: The
filter: quick
length: 5
filter: brown
length: 5
filter: fox
filter: jumps
length: 5
filter: over
length: 4
[5, 5, 5, 4]
μ΄ μ½λμ μμνμ κ²°κ³Ό 리μ€νΈκ° λ§λ€μ΄μ§ λ filter()μ map() ν¨μκ° νΈμΆλλ κ²μ 보μ¬μ€λ€. κ·Έλμ "Length of..." λ¬Έμ₯μ μ μΌ λ¨Όμ λ³Ό μ μλ κ²μ΄κ³ , μνμ€ μ²λ¦¬κ° κ·Έ νμ μ§νλλ€. νν°λ§μ ν΅κ³Όν μμλ€μ λν΄μλ, λ€μ μμλ₯Ό νν°λ§νκΈ° μ μ mapμ΄ μ€ννλ€. κ²°κ³Ό ν¬κΈ°κ° 4μ λλ¬ν λ, μ²λ¦¬ κ³Όμ μ λ©μΆλλ°, take(4)κ° λ°νν μ μλ κ°λ₯ν κ°μ₯ ν° μ¬μ΄μ¦μ΄κΈ° λλ¬Έμ΄λ€.
μνμ€ μ²λ¦¬ κ³Όμ μ λ€μκ³Ό κ°μ΄ λλ€.
μ΄ μμ μμ, μνμ€ μ²λ¦¬λ 리μ€νΈλ‘ κ°μ μμ μ 23 λ¨κ³λ‘ μ²λ¦¬νλ κ² λμ 18λ¨κ³λ₯Ό κ°μ§λ€.
'λΉ κ΅¬λ© μ±μ°κΈ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Kotlin] Companion objects (0) | 2021.03.29 |
---|---|
[μ©μ΄] sideload (0) | 2021.03.26 |
[Java] Daemon thread (0) | 2021.03.26 |
[Android] RecyclerView.Adapter μ click listener μμΉ (0) | 2021.03.23 |
[Library] Glide asFile()/downloadOnly()λ‘ μ»μ νμΌμ νμ₯μ .0 (0) | 2021.03.22 |