Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What is the difference between List, Sequence, ...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
omjoonkim
April 23, 2018

What is the difference between List, Sequence, and Observable?

in droind knights 2018

omjoonkim

April 23, 2018

Transcript

109 slides
  1. SPEAKER ࣗѐ ӣߧળ - ઱۽ উ٘۽੉٘ܳ ѐߊ - ࣗ೐౟ਝয ݃ীझ౟۽

    6th ݭ౭ - ۨ੉פझ౟ উ٘۽੉٘ ѐߊ੗. - ো೤ زইܻ MashUp ױ੢. - ইఃఫ୛, FPী ҙब੉ ݆׮. - email : [email protected] - gitHub : https://github.com/omjoonkim - facebook : https://www.facebook.com/zkxns38
  2. WHAT? Method chaining, also known as named parameter idiom, is

    a common syntax for invoking multiple method calls in object- oriented programming languages
  3. ߑߨ਷.. ▸ ҕधകಕ੉૑, Documents ▸ StackOverFlow and Google god ▸

    प೯ ࣽࢲ؀۽ ҳഅغয ੓ח ௏٘ өࠁӝ WHY?
  4. ߑߨ਷.. ▸ ҕधകಕ੉૑, Documents ▸ StackOverFlow and Google god ▸

    प೯ ࣽࢲ؀۽ ҳഅغয ੓ח ௏٘ өࠁӝ WHY?
  5. ੉੼? ▸ ղࠗ ҳഅਸ ࠆਵ۽ ॄ ੉ۿ + पઁ ҳഅ

    ੉೧о ೤୛ઉ ݺഛೞѱ ੉೧ о оӝ औ׮. ▸ ೧׼ API, Libraryܳ ѐߊೠ ࢎۈٜ੄ ࢸ҅ ੄ب, ӒܻҊ ௏٘झఋੌ ਸ ખ ؊ Ө੉ ੓ѱ ঌ ࣻ ੓׮. ▸ ௏٘ ੉೧۱੉ ֫ই૓׮. ▸ য়೑ ࣗझী ӝৈೡ ࣻ ੓ח ੄޷੓ח ୐ ߊ੗Ҵ! WHY?
  6. ੉۠ ௏ٜ٘ਸ.. 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) }
  7. ਗې ߄۔਷.. HOW? class MergingSequence<T1, T2, V> class SubSequence<T> class

    TakeSequence<T> class DropSequence<T> class DistinctSequence<T, K>
  8. ਗې ߄۔਷.. 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)
  9. рױೞѱ! 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) }
  10. ઱੄ ೡ੼ ▸ ௏٘ܳ ખ ؊ ӭՔೞѱ ࠁӝ ਤ೧ оदࢿ

    ߂ class ഑਷ method খױ ী ࠢח ఃਕٜ٘ਸ ઁѢೞ৓णפ׮. ▸ ௏٘ܳ ખ ؊ ӭՔೞѱ ࠁӝ ਤ೧ ਬਊೞҊ ੄޷ ੓ח Docsܳ ࢏ઁೞ ৓णפ׮. ▸ ݅ড पઁ۽ ௏٘ܳ ࠁन׮ݶ Docsܳ ࠁݶ ഻ঁ ੉೧ ೞӝ ए਋प Ѣীਃ! ▸ Observableэ਷ ҃਋ח दр࢚੄ ੉ਬ۽ о੢ рױೠ ColdStream ੄ ৘ઁ ௏٘۽ ഛੋೡ ৘੿ੑפ׮. HOW?
  11. LIST੄ CHAINING਷.. LIST ݒ chain݃׮ ࢜۽਍ destination(ܻझ౟)ܳ ݅ ٜয chain੄

    ೙ਃೠ ۈ׮ೣࣻܳ प೯ೠٍ Ѿҗчਸ destinationী ׸ই ׮਺ chainীѱ ֈѹ઱ח ߑध.
  12. (1..100) .map { listOf(it) } .flatten() .filter { it %

    3 == 0 } .forEach { println(it) } ਋ܻо ࢓ಝࠅ ௏٘! LIST
  13. (1..100) .map { listOf(it) } .flatten() .filter { it %

    3 == 0 } .forEach { println(it) } ਋ܻо ࢓ಝࠅ ௏٘! LIST
  14. fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return

    mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST
  15. fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return

    mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST
  16. fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return

    mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST map { listOf(it) }
  17. fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> { return

    mapTo( ArrayList<R>(collectionSizeOrDefault(10)), transform ) } MAP? LIST map { listOf(it) }
  18. 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
  19. 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
  20. 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
  21. ׮द جইоࢲ.. 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 }
  22. ࢤࢿ੗۽… 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 }
  23. 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 }
  24. (1..100) .map { listOf(it) } .flatten() .filter { it %

    3 == 0 } .forEach { println(it) } ਋ܻо ࢓ಝࠅ ௏٘! LIST
  25. FLATTEN? LIST fun <T> Iterable<Iterable<T>>.flatten(): List<T> { val result =

    ArrayList<T>() for (element in this) { result.addAll(element) } return result }
  26. MATTO୊ۢ.. LIST fun <T> Iterable<Iterable<T>>.flatten(): List<T> { val result =

    ArrayList<T>() for (element in this) { result.addAll(element) } return result }
  27. (1..100) .map { listOf(it) } .flatten() .filter { it %

    3 == 0 } .forEach { println(it) } ਋ܻо ࢓ಝࠅ ௏٘! LIST
  28. FILTER? LIST fun <T> Iterable<T>.filter( predicate: (T) -> Boolean ):

    List<T> { return filterTo(ArrayList(), predicate) }
  29. 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 }
  30. 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 }
  31. (1..100) .map { listOf(it) } .flatten() .filter { it %

    3 == 0 } .forEach { println(it) } ਋ܻо ࢓ಝࠅ ௏٘! LIST
  32. ੿ܻೞݶ! LIST ܻझ౟ী ׸ӟ ؘ੉ఠо ݆ਸ ҃਋ method chainingߑधਸ ॳחѪ਷

    दр੉ য়ې Ѧܾ ࣻ ੓׮. ژೠ ୭ઙ Ѿҗ઺ ౠ੿ чਸ ଺ਵ۰ ೡ ٸ
 ژೠ ݽٚ elementী ؀ೠ chain੉ ՘աঠ݅ ഛੋೡ ࣻ ੓׮.
  33. SEQUENCE੄ CHAINING਷.. SEQUENCE п chain݃׮ ঌݏ਷ Sequenceܳ ࢜۽ ٜ݅য ղݴ

    Terminal Sequence methodо ഐ୹ غ঻ਸ ٸ chain੄ ୐ Sequence੄ iteratorࠗఠ ࣽର੸ਵ۽ п chainػ Sequence੄ iterator੄ hasNext(), next()о ࣻ೯غয ୭ઙ Ѿҗޛਸ ߈ജೞח ߑध
  34. 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…
  35. 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 }
  36. SEQUECNE੄ CHAINING਷.. SEQUENCE .filter() .map() .flatMap() FILTERSEQUENCE predicate() Source(1..100) TRANSFORMING

    SEQUENCE FLATTENING SEQUENCE transform() transform() iterator iterator iterator
  37. 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 о ഐ ୹ ؼ ٸ!
  38. SEQUENCEܳ ࢤࢿೞח ׮ܲ ߑߨ SEQUENCE public fun <T : Any>

    generateSequence( seed: T?, nextFunction: (T) -> T? ): Sequence<T> = if (seed == null) EmptySequence else GeneratorSequence({ seed }, nextFunction)
  39. SEQUENCEܳ ࢤࢿೞח ׮ܲ ߑߨ SEQUENCE public fun <T : Any>

    generateSequence( seed: T?, nextFunction: (T) -> T? ): Sequence<T> = if (seed == null) EmptySequence else GeneratorSequence({ seed }, nextFunction)
  40. MAP SEQUENCE public fun <T, R> Sequence<T>.map(transform: (T) -> R):

    Sequence<R> { return TransformingSequence(this, transform) }
  41. MAP SEQUENCE public fun <T, R> Sequence<T>.map(transform: (T) -> R):

    Sequence<R> { return TransformingSequence(this, transform) }
  42. MAP SEQUENCE public fun <T, R> Sequence<T>.map(transform: (T) -> R):

    Sequence<R> { return TransformingSequence(this, transform) } (1..100).asSequence()
  43. 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 ) } }
  44. ߄۽ ੉੹ 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 ) } }
  45. ղࠗী 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 ) } }
  46. 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 ) } }
  47. 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() }
  48. 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) }
  49. ইө੹੄… 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 ) } }
  50. 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 } } }
  51. 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() } }
  52. 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() } }
  53. ղࠗ ೣࣻ ࠗ࠙ 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 }
  54. ղࠗ ೣࣻ ࠗ࠙ 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 }
  55. ղࠗ ೣࣻ ࠗ࠙ 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 }
  56. ղࠗ ೣࣻ ࠗ࠙ 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 }
  57. ղࠗ ೣࣻ ࠗ࠙ 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 }
  58. ׮द 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() } }
  59. 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 } } }
  60. ࢤࢿ੗ ࠗ࠙ SEQUENCE class FilteringSequence<T>( private val sequence: Sequence<T>, private

    val sendWhen: Boolean = true, private val predicate: (T) -> Boolean ) : Sequence<T>
  61. ࢤࢿ੗ ࠗ࠙ SEQUENCE class FilteringSequence<T>( private val sequence: Sequence<T>, private

    val sendWhen: Boolean = true, private val predicate: (T) -> Boolean ) : Sequence<T>
  62. 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 } }
  63. 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 } }
  64. 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 } }
  65. NEXTSTATE, NEXTITEM? SEQUENCE nextState : calkNext() ೣࣻܳ ా೧ ೧׼ iteratorо

    unknown,done,continue઺ যڃ ࢚కੋ૑ܳ աఋմ׮. 
 (GenreateSequenceэ਷ ҃਋ initial unknown ۄח ࢚కч੉ ୶о੸ਵ۽ ઓ੤.) ex) GeneratorSequence, FilteringSequence, TakeWhileSequence nextItem : calkNext() ೣࣻܳ ా೧ ೧׼ iterator੄ ׮਺ Itemчਸ о૑ѱ غח ߸ࣻ. nextState, nextItem, calkNext()ח ࣁ౟۽ ઓ੤ೠ׮.
  66. ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())

    { val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 }
  67. ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())

    { val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 }
  68. ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())

    { val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 }
  69. ղࠗ ೣࣻ ࠗ࠙ SEQUENCE private fun calcNext() { while (iterator.hasNext())

    { val item = iterator.next() if (predicate(item) == sendWhen) { nextItem = item nextState = 1 return } } nextState = 0 }
  70. 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 } }
  71. 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 } }
  72. ਋ܻо ࢓ಝࠅ ௏٘! SEQUENCE fun <T> Sequence<T>.forEach(action: (T) -> Unit):

    Unit { for (element in this) action(element) } Terminate Sequence method
  73. ੿ܻೞݶ! SEQUENCE Sequence੄ chaining਷ ૊п੸ਵ۽ ۽૒੉ ࣻ೯غח Ѫ੉ ইצ Terminate

    methodо ഐ୹ ؼ ٸ ೧׼ methodী ٮܲ Ѿҗ ч੉ ഐ୹غח lazy initializeߑध ੑפ׮. ٮۄࢲ ੘਷ ࢎ੉ૉܳ о૑Ҋ ੓ਸ ҃਋ listࠁ׮ ো࢑੉ ו۰૕ ࣻ ੓ਵա ୽࠙൤ ݆਷ ন੄ ࢎ੉ૉ ഑਷ find, firstэ਷ ౠ੿ чਸ ߈ജ߉Ҋ रਸ ٸীח ؊ ബҗ੸ੌ ࣻ ੓णפ׮.
  74. OBSERVABLE੄ CHAINING਷.. OBSERVABLE п chain݃׮ ঌݏ਷ Observable৬ ؀਽ೞח Observer,Disposeableਸ ٜ݅য

    subscribeػ ٍ, ই੉మ੉ ߊ೯غݶ ୐ߣ૩ chainࠗఠ ݃૑݄ө૑ пп੄ Obsever۽૒੉ ࣻ೯غয Ѿҗޛ੉ ߈ജغח ߑध
  75. 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)
  76. ޷ܻ ঌই ل ࢎ೦ٜ OBSERVABLE ObjectHelper : ೧׼ ё୓о Nullੋ૑

    ౸ױೞৈ Exceptionਸ thorw೧઱ח ৉ೡ੄ Helper RxJavaPlugins : RxJava Libraryীࢲ ݽٚ Streamী ؀ೞৈ ҕ ా੸ਵ۽ ୊ܻೞҊ र਷ ۽૒੉ ੓ਸٸ ࢎਊೞח Plugin ௥ೞѱ झఈೞѷणפ׮.
  77. ੿ܻೞݶ.. OBSERVABLE Observable੄ ই઱ ӝࠄ੸ੋ chainingߑध੉ যڌѱ ҳഅ غয੓ח૑݅ਸ ঌইࠄ

    Ѫ੉ӝ ٸޙী Hot stream, subject١ਸ पઁ۽ ࢎਊ೧ ࠁݴ ղࠗ ҳഅ ௏٘ܳ ੉೧೧ ࠁदחѦ ୶ୌ ೤פ׮ :)
  78. Q&A

More Decks by omjoonkim

Other Decks in Programming