Share
Embed
What is the difference between List, Sequence, and Observable?
in droind knights 2018
omjoonkim
April 23, 2018
Transcript
109 slides
-
SPEAKER ࣗѐ ӣߧળ - ۽ উ٘۽٘ܳ ѐߊ - ࣗਝয ݃ীझ۽
6th ݭ౭ - ۨפझ উ٘۽٘ ѐߊ. - ো زইܻ MashUp ױ. - ইఃఫ, FPী ҙब ݆. - email : [email protected] - gitHub : https://github.com/omjoonkim - facebook : https://www.facebook.com/zkxns38 -
WHAT? Method chaining, also known as named parameter idiom, is
a common syntax for invoking multiple method calls in object- oriented programming languages -
WHAT? (1..100) .map { listOf(it) } .flatten() .filter { it
% 3 == 0 } .forEach { println(it) } -
ߑߨ.. ▸ ҕधകಕ, Documents ▸ StackOverFlow and Google god ▸
प೯ ࣽࢲ۽ ҳഅغয ח ٘ өࠁӝ WHY? -
ߑߨ.. ▸ ҕधകಕ, Documents ▸ StackOverFlow and Google god ▸
प೯ ࣽࢲ۽ ҳഅغয ח ٘ өࠁӝ WHY? -
? ▸ ղࠗ ҳഅਸ ࠆਵ۽ ॄ ۿ + पઁ ҳഅ
೧о ઉ ݺഛೞѱ ೧ о оӝ औ. ▸ ೧ API, Libraryܳ ѐߊೠ ࢎۈٜ ࢸ҅ ب, ӒܻҊ ٘झఋੌ ਸ ખ ؊ Ө ѱ ঌ ࣻ . ▸ ٘ ೧۱ ֫ই. ▸ য় ࣗझী ӝৈೡ ࣻ ח ח ߊҴ! WHY? -
۠ ٜ٘ਸ.. HOW? (1..100) .map { listOf(it) } .flatten() .filter
{ it % 3 == 0 } .forEach { println(it) } (1..100).asSequence() .map { listOf(it) } .flatten() .filter { it % 3 == 0 } .forEach { println(it) } Observable.fromIterable(1..100) .map { it * 2 } .filter { it % 3 == 0 } .subscribe { println(it) } -
ਗې ߄۔.. HOW? class MergingSequence<T1, T2, V> class SubSequence<T> class
TakeSequence<T> class DropSequence<T> class DistinctSequence<T, K> -
ਗې ߄۔.. HOW? list.groupBy { it.from } .filter { it.key
== KEY } .values .flatMap { it } .map { it.data } .flatMap { it } .forEach { println(it) } topicId .compose<Long> { loadBeforeComment.withLatestFrom(it, BiFunction { _, t2 -> t2 }) } .throttleFirst(1000, TimeUnit.MILLISECONDS) .flatMapMaybe { chatRepository.loadBeforeChat(it).neverError() } .bindToLifeCycle() .subscribe(successLoadChats) -
рױೞѱ! HOW? (1..100) .map { listOf(it) } .flatten() .filter {
it % 3 == 0 } .forEach { println(it) } (1..100).asSequence() .map { listOf(it) } .flatten() .filter { it % 3 == 0 } .forEach { println(it) } Observable.fromIterable(1..100) .map { it * 2 } .filter { it % 3 == 0 } .subscribe { println(it) } -
ೡ ▸ ٘ܳ ખ ؊ ӭՔೞѱ ࠁӝ ਤ೧ оदࢿ
߂ class method খױ ী ࠢח ఃਕٜ٘ਸ ઁѢೞणפ. ▸ ٘ܳ ખ ؊ ӭՔೞѱ ࠁӝ ਤ೧ ਬਊೞҊ ח Docsܳ ઁೞ णפ. ▸ ݅ড पઁ۽ ٘ܳ ࠁनݶ Docsܳ ࠁݶ ഻ঁ ೧ ೞӝ एप Ѣীਃ! ▸ Observableэ ҃ח दр࢚ ਬ۽ о рױೠ ColdStream ઁ ٘۽ ഛੋೡ ੑפ. HOW? -
LIST CHAINING.. LIST ݒ chain݃ ࢜۽ destination(ܻझ)ܳ ݅ ٜয chain
ਃೠ ۈೣࣻܳ प೯ೠٍ Ѿҗчਸ destinationী ই chainীѱ ֈѹח ߑध. -
LIST CHAINING.. LIST LIST .filter() .map() .flatMap() predicate() LIST LIST
transform() transform() Source(1..100) -
(1..100) .map { listOf(it) } .flatten() .filter { it %
3 == 0 } .forEach { println(it) } ܻо ಝࠅ ٘! LIST -
(1..100) .map { listOf(it) } .flatten() .filter { it %
3 == 0 } .forEach { println(it) } ܻо ಝࠅ ٘! LIST -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST map { listOf(it) } -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST map { listOf(it) } -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } COLLECTIONSIZEORDEFAULT? LIST fun <T> Iterable<T>.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } ੜࠁݶ ITERABLEী ഛ ೣࣻ.. LIST fun <T> Iterable<T>.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default Progression Collection No Size -
fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return
mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } Ӓېࢲ ۠ ೣࣻо… LIST fun <T> Iterable<T>.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default -
द جইоࢲ.. MAPTO? LIST fun <T, R, C : MutableCollection<in
R>> Iterable<T>.mapTo( destination: C, transform: (T) -> R ): C { for (item in this) destination.add(transform(item)) return destination } -
ࢤࢿ۽… LIST fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo(
destination: C, transform: (T) -> R ): C { for (item in this) destination.add(transform(item)) return destination } -
DESTINATIONী чਸ ֍যળ LIST fun <T, R, C : MutableCollection<in
R>> Iterable<T>.mapTo( destination: C, transform: (T) -> R ): C { for (item in this) destination.add(transform(item)) return destination } -
(1..100) .map { listOf(it) } .flatten() .filter { it %
3 == 0 } .forEach { println(it) } ܻо ಝࠅ ٘! LIST -
FLATTEN? LIST fun <T> Iterable<Iterable<T>>.flatten(): List<T> { val result =
ArrayList<T>() for (element in this) { result.addAll(element) } return result } -
MATTOۢ.. LIST fun <T> Iterable<Iterable<T>>.flatten(): List<T> { val result =
ArrayList<T>() for (element in this) { result.addAll(element) } return result } -
(1..100) .map { listOf(it) } .flatten() .filter { it %
3 == 0 } .forEach { println(it) } ܻо ಝࠅ ٘! LIST -
FILTER? LIST fun <T> Iterable<T>.filter( predicate: (T) -> Boolean ):
List<T> { return filterTo(ArrayList(), predicate) } -
FILTER TO? LIST fun <T> Iterable<T>.filter( predicate: (T) -> Boolean
): List<T> { return filterTo(ArrayList(), predicate) } fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo( destination: C, predicate: (T) -> Boolean ): C { for (element in this) if (predicate(element)) destination.add(element) return destination } -
MATTO, FLATTEN ࣻ೯ ߑधҗ э LIST fun <T> Iterable<T>.filter( predicate:
(T) -> Boolean ): List<T> { return filterTo(ArrayList(), predicate) } fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo( destination: C, predicate: (T) -> Boolean ): C { for (element in this) if (predicate(element)) destination.add(element) return destination } -
(1..100) .map { listOf(it) } .flatten() .filter { it %
3 == 0 } .forEach { println(it) } ܻо ಝࠅ ٘! LIST -
FOREACH? LIST fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element) } -
рױ! LIST fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element) } -
ܻೞݶ! LIST ܻझী ӟ ؘఠо ݆ਸ ҃ method chainingߑधਸ ॳחѪ
दр য়ې Ѧܾ ࣻ . ژೠ ୭ઙ Ѿҗ ౠ чਸ ਵ۰ ೡ ٸ ژೠ ݽٚ elementী ೠ chain աঠ݅ ഛੋೡ ࣻ . -
SEQUENCE CHAINING.. SEQUENCE п chain݃ ঌݏ Sequenceܳ ࢜۽ ٜ݅য ղݴ
Terminal Sequence methodо ഐ غਸ ٸ chain Sequence iteratorࠗఠ ࣽରਵ۽ п chainػ Sequence iterator hasNext(), next()о ࣻ೯غয ୭ઙ Ѿҗޛਸ ߈ജೞח ߑध -
TERMINAL SEQUENCE? INTERMEDIATE SEQUENCE? SEQUENCE Terminal Sequence method: return ч
Sequence о ইצ Sequence method Ex) toList(), find() , first() , etc… Intermediate Sequence method: return ч Sequenceੋ Sequence method Ex) map(), filter() , flatten() , etc… -
SEQUENCE ҳࢿ SEQUENCE public interface Sequence<out T> { public operator
fun iterator(): Iterator<T> } public interface Iterator<out T> { public operator fun next(): T public operator fun hasNext(): Boolean } -
SEQUECNE CHAINING.. SEQUENCE .filter() .map() .flatMap() FILTERSEQUENCE predicate() Source(1..100) TRANSFORMING
SEQUENCE FLATTENING SEQUENCE transform() transform() iterator iterator iterator -
OPERATOR KEYWORD SEQUENCE public interface Sequence<out T> { public operator
fun iterator(): Iterator<T> } public interface Iterator<out T> { public operator fun next(): T public operator fun hasNext(): Boolean } for (element in this) Terminate Sequence method о ഐ ؼ ٸ! -
ܻо ಝࠅ ٘! SEQUENCE (1..100).asSequence() .map { listOf(it) } .flatten()
.filter { it % 3 == 0 } .forEach { println(it) } -
ܻо ಝࠅ ٘! SEQUENCE (1..100).asSequence() .map { listOf(it) } .flatten()
.filter { it % 3 == 0 } .forEach { println(it) } -
ASSQUENCE? SEQUENCE public fun <T> Iterable<T>.asSequence(): Sequence<T> { return Sequence
{ this.iterator() } } Iterable to Sequence -
SEQUENCEܳ ࢤࢿೞח ܲ ߑߨ SEQUENCE public fun <T : Any>
generateSequence( seed: T?, nextFunction: (T) -> T? ): Sequence<T> = if (seed == null) EmptySequence else GeneratorSequence({ seed }, nextFunction) -
SEQUENCEܳ ࢤࢿೞח ܲ ߑߨ SEQUENCE public fun <T : Any>
generateSequence( seed: T?, nextFunction: (T) -> T? ): Sequence<T> = if (seed == null) EmptySequence else GeneratorSequence({ seed }, nextFunction) -
ܻо ಝࠅ ٘! SEQUENCE (1..100).asSequence() .map { listOf(it) } .flatten()
.filter { it % 3 == 0 } .forEach { println(it) } -
MAP SEQUENCE public fun <T, R> Sequence<T>.map(transform: (T) -> R):
Sequence<R> { return TransformingSequence(this, transform) } -
MAP SEQUENCE public fun <T, R> Sequence<T>.map(transform: (T) -> R):
Sequence<R> { return TransformingSequence(this, transform) } -
MAP SEQUENCE public fun <T, R> Sequence<T>.map(transform: (T) -> R):
Sequence<R> { return TransformingSequence(this, transform) } (1..100).asSequence() -
TRANSFORMINGSEQUENCE SEQUENCE class TransformingSequence<T, R> constructor( private val sequence: Sequence<T>,
private val transformer: (T) -> R ) : Sequence<R> { override fun iterator(): Iterator<R> = object : Iterator<R> { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun <E> flatten(iterator: (R) -> Iterator<E>): Sequence<E> { return FlatteningSequence<T, R, E>( sequence, transformer, iterator ) } } -
߄۽ SEQUENCE SEQUENCE class TransformingSequence<T, R> constructor( private val
sequence: Sequence<T>, private val transformer: (T) -> R ) : Sequence<R> { override fun iterator(): Iterator<R> = object : Iterator<R> { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun <E> flatten(iterator: (R) -> Iterator<E>): Sequence<E> { return FlatteningSequence<T, R, E>( sequence, transformer, iterator ) } } -
ղࠗী ITERATORਸ оҊ SEQUENCE class TransformingSequence<T, R> constructor( private
val sequence: Sequence<T>, private val transformer: (T) -> R ) : Sequence<R> { override fun iterator(): Iterator<R> = object : Iterator<R> { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun <E> flatten(iterator: (R) -> Iterator<E>): Sequence<E> { return FlatteningSequence<T, R, E>( sequence, transformer, iterator ) } } -
TRANSFORMINGSEQUENCE ITERATOR METHODী ҙৈ SEQUENCE class TransformingSequence<T, R> constructor( private
val sequence: Sequence<T>, private val transformer: (T) -> R ) : Sequence<R> { override fun iterator(): Iterator<R> = object : Iterator<R> { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun <E> flatten(iterator: (R) -> Iterator<E>): Sequence<E> { return FlatteningSequence<T, R, E>( sequence, transformer, iterator ) } } -
ܻо ಝࠅ ٘! SEQUENCE (1..100).asSequence() .map { listOf(it) } .flatten()
.filter { it % 3 == 0 } .forEach { println(it) } -
FLATTEN SEQUENCE fun <T, R> Sequence<T>.flatten( iterator: (T) -> Iterator<R>
): Sequence<R> { if (this is TransformingSequence<*, *>) { return (this as TransformingSequence<*, T>).flatten(iterator) } return FlatteningSequence(this, { it }, iterator) } public fun <T> Sequence<Iterable<T>>.flatten(): Sequence<T> = flatten { it.iterator() } -
FLATTEN SEQUENCE fun <T, R> Sequence<T>.flatten( iterator: (T) -> Iterator<R>
): Sequence<R> { if (this is TransformingSequence<*, *>) { return (this as TransformingSequence<*, T>).flatten(iterator) } return FlatteningSequence(this, { it }, iterator) } public fun <T> Sequence<Iterable<T>>.flatten(): Sequence<T> = flatten { it.iterator() } (1..100).asSequence() .map { listOf(it) } .flatten() .filter { it % 3 == 0 } .forEach { println(it) } -
ইө… SEQUENCE class TransformingSequence<T, R> constructor( private val sequence: Sequence<T>,
private val transformer: (T) -> R ) : Sequence<R> { override fun iterator(): Iterator<R> = object : Iterator<R> { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun <E> flatten(iterator: (R) -> Iterator<E>): Sequence<E> { return FlatteningSequence<T, R, E>( sequence, transformer, iterator ) } } -
FLATTENINGSEQUENCE… SEQUENCE internal class FlatteningSequence<T, R, E> constructor( private val
sequence: Sequence<T>, private val transformer: (T) -> R, private val iterator: (R) -> Iterator<E> ) : Sequence<E> { override fun iterator(): Iterator<E> = object : Iterator<E> { val iterator = sequence.iterator() var itemIterator: Iterator<E>? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } private fun ensureItemIterator(): Boolean { if (itemIterator?.hasNext() == false) itemIterator = null while (itemIterator == null) { if (!iterator.hasNext()) { return false } else { val element = iterator.next() val nextItemIterator = iterator(transformer(element)) if (nextItemIterator.hasNext()) { itemIterator = nextItemIterator return true } } } return true } } } -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<E> = object :
Iterator<E> { val iterator = sequence.iterator() var itemIterator: Iterator<E>? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } } -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<E> = object :
Iterator<E> { val iterator = sequence.iterator() var itemIterator: Iterator<E>? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun ensureItemIterator(): Boolean { if
(itemIterator?.hasNext() == false) itemIterator = null while (itemIterator == null) { if (!iterator.hasNext()) { return false } else { val element = iterator.next() val nextItemIterator = iterator(transformer(element)) if (nextItemIterator.hasNext()) { itemIterator = nextItemIterator return true } } } return true } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun ensureItemIterator(): Boolean { if
(itemIterator?.hasNext() == false) itemIterator = null while (itemIterator == null) { if (!iterator.hasNext()) { return false } else { val element = iterator.next() val nextItemIterator = iterator(transformer(element)) if (nextItemIterator.hasNext()) { itemIterator = nextItemIterator return true } } } return true } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun ensureItemIterator(): Boolean { if
(itemIterator?.hasNext() == false) itemIterator = null while (itemIterator == null) { if (!iterator.hasNext()) { return false } else { val element = iterator.next() val nextItemIterator = iterator(transformer(element)) if (nextItemIterator.hasNext()) { itemIterator = nextItemIterator return true } } } return true } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun ensureItemIterator(): Boolean { if
(itemIterator?.hasNext() == false) itemIterator = null while (itemIterator == null) { if (!iterator.hasNext()) { return false } else { val element = iterator.next() val nextItemIterator = iterator(transformer(element)) if (nextItemIterator.hasNext()) { itemIterator = nextItemIterator return true } } } return true } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun ensureItemIterator(): Boolean { if
(itemIterator?.hasNext() == false) itemIterator = null while (itemIterator == null) { if (!iterator.hasNext()) { return false } else { val element = iterator.next() val nextItemIterator = iterator(transformer(element)) if (nextItemIterator.hasNext()) { itemIterator = nextItemIterator return true } } } return true } -
द ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<E> = object
: Iterator<E> { val iterator = sequence.iterator() var itemIterator: Iterator<E>? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } } -
ܻо ಝࠅ ٘! SEQUENCE (1..100).asSequence() .map { listOf(it) } .flatten()
.filter { it % 3 == 0 } .forEach { println(it) } -
FILTER SEQUENCE fun <T> Sequence<T>.filter(predicate: (T) -> Boolean): Sequence<T> {
return FilteringSequence(this, true, predicate) } -
FILTER SEQUENCE fun <T> Sequence<T>.filter(predicate: (T) -> Boolean): Sequence<T> {
return FilteringSequence(this, true, predicate) } -
FILTER SEQUENCE internal class FilteringSequence<T>(private val sequence: Sequence<T>, private val
sendWhen: Boolean = true, private val predicate: (T) -> Boolean ) : Sequence<T> { override fun iterator(): Iterator<T> = object : Iterator<T> { val iterator = sequence.iterator() var nextState: Int = -1 // -1 for unknown, 0 for done, 1 for continue var nextItem: T? = null private fun calcNext() { while (iterator.hasNext()) { val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 } override fun next(): T { if (nextState == -1) calcNext() if (nextState == 0) throw NoSuchElementException() val result = nextItem nextItem = null nextState = -1 @Suppress("UNCHECKED_CAST") return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } } -
ࢤࢿ ࠗ࠙ SEQUENCE class FilteringSequence<T>( private val sequence: Sequence<T>, private
val sendWhen: Boolean = true, private val predicate: (T) -> Boolean ) : Sequence<T> -
ࢤࢿ ࠗ࠙ SEQUENCE class FilteringSequence<T>( private val sequence: Sequence<T>, private
val sendWhen: Boolean = true, private val predicate: (T) -> Boolean ) : Sequence<T> -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<T> = object :
Iterator<T> { val iterator = sequence.iterator() var nextState: Int = -1 // -1 for unknown, 0 for done, 1 for continue var nextItem: T? = null override fun next(): T { if (nextState == -1) calcNext() if (nextState == 0) throw NoSuchElementException() val result = nextItem nextItem = null nextState = -1 @Suppress("UNCHECKED_CAST") return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<T> = object :
Iterator<T> { val iterator = sequence.iterator() var nextState: Int = -1 // -1 for unknown, 0 for done, 1 for continue var nextItem: T? = null override fun next(): T { if (nextState == -1) calcNext() if (nextState == 0) throw NoSuchElementException() val result = nextItem nextItem = null nextState = -1 @Suppress("UNCHECKED_CAST") return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<T> = object :
Iterator<T> { val iterator = sequence.iterator() var nextState: Int = -1 // -1 for unknown, 0 for done, 1 for continue var nextItem: T? = null override fun next(): T { if (nextState == -1) calcNext() if (nextState == 0) throw NoSuchElementException() val result = nextItem nextItem = null nextState = -1 @Suppress("UNCHECKED_CAST") return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } -
NEXTSTATE, NEXTITEM? SEQUENCE nextState : calkNext() ೣࣻܳ ా೧ ೧ iteratorо
unknown,done,continue যڃ ࢚కੋܳ աఋմ. (GenreateSequenceэ ҃ initial unknown ۄח ࢚కч ୶оਵ۽ ઓ.) ex) GeneratorSequence, FilteringSequence, TakeWhileSequence nextItem : calkNext() ೣࣻܳ ా೧ ೧ iterator Itemчਸ оѱ غח ߸ࣻ. nextState, nextItem, calkNext()ח ࣁ۽ ઓೠ. -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())
{ val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())
{ val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())
{ val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 } -
ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())
{ val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 } -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<T> = object :
Iterator<T> { override fun next(): T { if (nextState == -1) calcNext() if (nextState == 0) throw NoSuchElementException() val result = nextItem nextItem = null nextState = -1 @Suppress("UNCHECKED_CAST") return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } -
ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator<T> = object :
Iterator<T> { override fun next(): T { if (nextState == -1) calcNext() if (nextState == 0) throw NoSuchElementException() val result = nextItem nextItem = null nextState = -1 @Suppress("UNCHECKED_CAST") return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } -
ܻо ಝࠅ ٘! SEQUENCE (1..100).asSequence() .map { listOf(it) } .flatten()
.filter { it % 3 == 0 } .forEach { println(it) } -
FOREACH SEQUENCE fun <T> Sequence<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element) } -
ܻо ಝࠅ ٘! SEQUENCE fun <T> Sequence<T>.forEach(action: (T) -> Unit):
Unit { for (element in this) action(element) } Terminate Sequence method -
ܻೞݶ! SEQUENCE Sequence chaining пਵ۽ ۽ ࣻ೯غח Ѫ ইצ Terminate
methodо ഐ ؼ ٸ ೧ methodী ٮܲ Ѿҗ ч ഐغח lazy initializeߑध ੑפ. ٮۄࢲ ࢎૉܳ оҊ ਸ ҃ listࠁ ো ו۰ ࣻ ਵա ࠙ ݆ ন ࢎૉ find, firstэ ౠ чਸ ߈ജ߉Ҋ रਸ ٸীח ؊ ബҗੌ ࣻ णפ. -
OBSERVABLE CHAINING.. OBSERVABLE п chain݃ ঌݏ Observable৬ ೞח Observer,Disposeableਸ ٜ݅য
subscribeػ ٍ, ইమ ߊ೯غݶ ߣ૩ chainࠗఠ ݄݃ө пп Obsever۽ ࣻ೯غয Ѿҗޛ ߈ജغח ߑध -
OBSERVABLE .filter() .map() Source(1..100) .subscribe() LamdaObserver MapObserver actual = LamdaObserver
FilterObserver actual = MapObserver observer.onSubscribe() source.subscribe(observer) source.subscribe(observer) observer.onNext() ખ ؊ ࣁ.. ObservableMap.subscribeActual(observer) ObservableFilter.subscribeActual(observer) Source.subscribeActual(observer) -
ܻ ঌই ل ࢎ೦ٜ OBSERVABLE ObjectHelper : ೧ ёо Nullੋ
౸ױೞৈ Exceptionਸ thorw೧ח ೡ Helper RxJavaPlugins : RxJava Libraryীࢲ ݽٚ Streamী ೞৈ ҕ ాਵ۽ ܻೞҊ र ۽ ਸٸ ࢎਊೞח Plugin ೞѱ झఈೞѷणפ. -
ܻೞݶ.. OBSERVABLE Observable ই ӝࠄੋ chainingߑध যڌѱ ҳഅ غযח݅ਸ ঌইࠄ
Ѫӝ ٸޙী Hot stream, subject١ਸ पઁ۽ ࢎਊ೧ ࠁݴ ղࠗ ҳഅ ٘ܳ ೧೧ ࠁदחѦ ୶ୌ פ :)