Slide 1

Slide 1 text

Speaker. What is the difference between List, Sequence, and Observable? ӣߧળ

Slide 2

Slide 2 text

SPEAKER ࣗѐ ӣߧળ - ઱۽ উ٘۽੉٘ܳ ѐߊ - ࣗ೐౟ਝয ݃ীझ౟۽ 6th ݭ౭ - ۨ੉פझ౟ উ٘۽੉٘ ѐߊ੗. - ো೤ زইܻ MashUp ױ੢. - ইఃఫ୛, FPী ҙब੉ ݆׮. - email : [email protected] - gitHub : https://github.com/omjoonkim - facebook : https://www.facebook.com/zkxns38

Slide 3

Slide 3 text

WHAT?

Slide 4

Slide 4 text

WHAT? List Sequence Observable

Slide 5

Slide 5 text

WHAT? Method Chaining?

Slide 6

Slide 6 text

WHAT? Method chaining, also known as named parameter idiom, is a common syntax for invoking multiple method calls in object- oriented programming languages

Slide 7

Slide 7 text

WHAT? ߈ജ ч੉ Objectੋ ݫࣗ٘ܳ োࣘ੸ਵ۽ ࢎਊೞৈ ೐۽Ӓې߁ ೞח ੌ߈੸ੋ ҳޙ.

Slide 8

Slide 8 text

WHAT? (1..100) .map { listOf(it) } .flatten() .filter { it % 3 == 0 } .forEach { println(it) }

Slide 9

Slide 9 text

WHAT? List Sequence Observable

Slide 10

Slide 10 text

WHY?

Slide 11

Slide 11 text

য۵… WHY?

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

੉੼? ▸ ղࠗ ҳഅਸ ࠆਵ۽ ॄ ੉ۿ + पઁ ҳഅ ੉೧о ೤୛ઉ ݺഛೞѱ ੉೧ о оӝ औ׮. ▸ ೧׼ API, Libraryܳ ѐߊೠ ࢎۈٜ੄ ࢸ҅ ੄ب, ӒܻҊ ௏٘झఋੌ ਸ ખ ؊ Ө੉ ੓ѱ ঌ ࣻ ੓׮. ▸ ௏٘ ੉೧۱੉ ֫ই૓׮. ▸ য়೑ ࣗझী ӝৈೡ ࣻ ੓ח ੄޷੓ח ୐ ߊ੗Ҵ! WHY?

Slide 15

Slide 15 text

HOW?

Slide 16

Slide 16 text

੉۠ ௏ٜ٘ਸ.. 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) }

Slide 17

Slide 17 text

ਗې ߄۔਷.. HOW? class MergingSequence class SubSequence class TakeSequence class DropSequence class DistinctSequence

Slide 18

Slide 18 text

ਗې ߄۔਷.. HOW? list.groupBy { it.from } .filter { it.key == KEY } .values .flatMap { it } .map { it.data } .flatMap { it } .forEach { println(it) } topicId .compose { loadBeforeComment.withLatestFrom(it, BiFunction { _, t2 -> t2 }) } .throttleFirst(1000, TimeUnit.MILLISECONDS) .flatMapMaybe { chatRepository.loadBeforeChat(it).neverError() } .bindToLifeCycle() .subscribe(successLoadChats)

Slide 19

Slide 19 text

ೞ૑݅.. HOW?

Slide 20

Slide 20 text

рױೞѱ! 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) }

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

LIST

Slide 23

Slide 23 text

LIST੄ CHAINING਷.. LIST ݒ chain݃׮ ࢜۽਍ destination(ܻझ౟)ܳ ݅ ٜয chain੄ ೙ਃೠ ۈ׮ೣࣻܳ प೯ೠٍ Ѿҗчਸ destinationী ׸ই ׮਺ chainীѱ ֈѹ઱ח ߑध.

Slide 24

Slide 24 text

LIST੄ CHAINING਷.. LIST LIST .filter() .map() .flatMap() predicate() LIST LIST transform() transform() Source(1..100)

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

fun Iterable.map(transform: (T) -> R): List { return mapTo( ArrayList(collectionSizeOrDefault(10)), transform ) } COLLECTIONSIZEORDEFAULT? LIST fun Iterable.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default

Slide 32

Slide 32 text

fun Iterable.map(transform: (T) -> R): List { return mapTo( ArrayList(collectionSizeOrDefault(10)), transform ) } ੜࠁݶ ITERABLEী ഛ੢ ೣࣻ.. LIST fun Iterable.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default Progression Collection No Size

Slide 33

Slide 33 text

fun Iterable.map(transform: (T) -> R): List { return mapTo( ArrayList(collectionSizeOrDefault(10)), transform ) } Ӓېࢲ ੉۠ ೣࣻо… LIST fun Iterable.collectionSizeOrDefault(default: Int): Int = if (this is Collection<*>) this.size else default

Slide 34

Slide 34 text

׮द جইоࢲ.. MAPTO? LIST fun > Iterable.mapTo( destination: C, transform: (T) -> R ): C { for (item in this) destination.add(transform(item)) return destination }

Slide 35

Slide 35 text

ࢤࢿ੗۽… LIST fun > Iterable.mapTo( destination: C, transform: (T) -> R ): C { for (item in this) destination.add(transform(item)) return destination }

Slide 36

Slide 36 text

DESTINATIONী чਸ ֍যળ׮ LIST fun > Iterable.mapTo( destination: C, transform: (T) -> R ): C { for (item in this) destination.add(transform(item)) return destination }

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

FLATTEN? LIST fun Iterable>.flatten(): List { val result = ArrayList() for (element in this) { result.addAll(element) } return result }

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

FILTER? LIST fun Iterable.filter( predicate: (T) -> Boolean ): List { return filterTo(ArrayList(), predicate) }

Slide 42

Slide 42 text

FILTER TO? LIST fun Iterable.filter( predicate: (T) -> Boolean ): List { return filterTo(ArrayList(), predicate) } fun > Iterable.filterTo( destination: C, predicate: (T) -> Boolean ): C { for (element in this) if (predicate(element)) destination.add(element) return destination }

Slide 43

Slide 43 text

MATTO, FLATTEN੄ ࣻ೯ ߑधҗ э׮ LIST fun Iterable.filter( predicate: (T) -> Boolean ): List { return filterTo(ArrayList(), predicate) } fun > Iterable.filterTo( destination: C, predicate: (T) -> Boolean ): C { for (element in this) if (predicate(element)) destination.add(element) return destination }

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

FOREACH? LIST fun Iterable.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }

Slide 46

Slide 46 text

рױ! LIST fun Iterable.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }

Slide 47

Slide 47 text

੿ܻೞݶ! LIST ܻझ౟ী ׸ӟ ؘ੉ఠо ݆ਸ ҃਋ method chainingߑधਸ ॳחѪ਷ दр੉ য়ې Ѧܾ ࣻ ੓׮. ژೠ ୭ઙ Ѿҗ઺ ౠ੿ чਸ ଺ਵ۰ ೡ ٸ
 ژೠ ݽٚ elementী ؀ೠ chain੉ ՘աঠ݅ ഛੋೡ ࣻ ੓׮.

Slide 48

Slide 48 text

SEQUENCE

Slide 49

Slide 49 text

SEQUENCE੄ CHAINING਷.. SEQUENCE п chain݃׮ ঌݏ਷ Sequenceܳ ࢜۽ ٜ݅য ղݴ Terminal Sequence methodо ഐ୹ غ঻ਸ ٸ chain੄ ୐ Sequence੄ iteratorࠗఠ ࣽର੸ਵ۽ п chainػ Sequence੄ iterator੄ hasNext(), next()о ࣻ೯غয ୭ઙ Ѿҗޛਸ ߈ജೞח ߑध

Slide 50

Slide 50 text

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…

Slide 51

Slide 51 text

SEQUENCE੄ ҳࢿ SEQUENCE public interface Sequence { public operator fun iterator(): Iterator } public interface Iterator { public operator fun next(): T public operator fun hasNext(): Boolean }

Slide 52

Slide 52 text

SEQUECNE੄ CHAINING਷.. SEQUENCE .filter() .map() .flatMap() FILTERSEQUENCE predicate() Source(1..100) TRANSFORMING SEQUENCE FLATTENING SEQUENCE transform() transform() iterator iterator iterator

Slide 53

Slide 53 text

OPERATOR KEYWORD SEQUENCE public interface Sequence { public operator fun iterator(): Iterator } public interface Iterator { public operator fun next(): T public operator fun hasNext(): Boolean } for (element in this) Terminate Sequence method о ഐ ୹ ؼ ٸ!

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

ASSQUENCE? SEQUENCE public fun Iterable.asSequence(): Sequence { return Sequence { this.iterator() } } Iterable to Sequence

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

TRANSFORMINGSEQUENCE SEQUENCE class TransformingSequence constructor( private val sequence: Sequence, private val transformer: (T) -> R ) : Sequence { override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun flatten(iterator: (R) -> Iterator): Sequence { return FlatteningSequence( sequence, transformer, iterator ) } }

Slide 64

Slide 64 text

߄۽ ੉੹ SEQUENCE SEQUENCE class TransformingSequence constructor( private val sequence: Sequence, private val transformer: (T) -> R ) : Sequence { override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun flatten(iterator: (R) -> Iterator): Sequence { return FlatteningSequence( sequence, transformer, iterator ) } }

Slide 65

Slide 65 text

ղࠗী ITERATORਸ о૑Ҋ ੓׮ SEQUENCE class TransformingSequence constructor( private val sequence: Sequence, private val transformer: (T) -> R ) : Sequence { override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun flatten(iterator: (R) -> Iterator): Sequence { return FlatteningSequence( sequence, transformer, iterator ) } }

Slide 66

Slide 66 text

TRANSFORMINGSEQUENCE੄ ITERATOR METHODী ҙৈ SEQUENCE class TransformingSequence constructor( private val sequence: Sequence, private val transformer: (T) -> R ) : Sequence { override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun flatten(iterator: (R) -> Iterator): Sequence { return FlatteningSequence( sequence, transformer, iterator ) } }

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

FLATTEN SEQUENCE public fun Sequence>.flatten(): Sequence = flatten { it.iterator() }

Slide 69

Slide 69 text

FLATTEN SEQUENCE fun Sequence.flatten( iterator: (T) -> Iterator ): Sequence { if (this is TransformingSequence<*, *>) { return (this as TransformingSequence<*, T>).flatten(iterator) } return FlatteningSequence(this, { it }, iterator) } public fun Sequence>.flatten(): Sequence = flatten { it.iterator() }

Slide 70

Slide 70 text

FLATTEN SEQUENCE fun Sequence.flatten( iterator: (T) -> Iterator ): Sequence { if (this is TransformingSequence<*, *>) { return (this as TransformingSequence<*, T>).flatten(iterator) } return FlatteningSequence(this, { it }, iterator) } public fun Sequence>.flatten(): Sequence = flatten { it.iterator() } (1..100).asSequence() .map { listOf(it) } .flatten() .filter { it % 3 == 0 } .forEach { println(it) }

Slide 71

Slide 71 text

ইө੹੄… SEQUENCE class TransformingSequence constructor( private val sequence: Sequence, private val transformer: (T) -> R ) : Sequence { override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() override fun next(): R { return transformer(iterator.next()) } override fun hasNext(): Boolean { return iterator.hasNext() } } fun flatten(iterator: (R) -> Iterator): Sequence { return FlatteningSequence( sequence, transformer, iterator ) } }

Slide 72

Slide 72 text

FLATTENINGSEQUENCE… SEQUENCE internal class FlatteningSequence constructor( private val sequence: Sequence, private val transformer: (T) -> R, private val iterator: (R) -> Iterator ) : Sequence { override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() var itemIterator: Iterator? = 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 } } }

Slide 73

Slide 73 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() var itemIterator: Iterator? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } }

Slide 74

Slide 74 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() var itemIterator: Iterator? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } }

Slide 75

Slide 75 text

ղࠗ ೣࣻ ࠗ࠙ 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 }

Slide 76

Slide 76 text

ղࠗ ೣࣻ ࠗ࠙ 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 }

Slide 77

Slide 77 text

ղࠗ ೣࣻ ࠗ࠙ 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 }

Slide 78

Slide 78 text

ղࠗ ೣࣻ ࠗ࠙ 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 }

Slide 79

Slide 79 text

ղࠗ ೣࣻ ࠗ࠙ 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 }

Slide 80

Slide 80 text

׮द ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { val iterator = sequence.iterator() var itemIterator: Iterator? = null override fun next(): E { if (!ensureItemIterator()) throw NoSuchElementException() return itemIterator!!.next() } override fun hasNext(): Boolean { return ensureItemIterator() } }

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

FILTER SEQUENCE fun Sequence.filter(predicate: (T) -> Boolean): Sequence { return FilteringSequence(this, true, predicate) }

Slide 83

Slide 83 text

FILTER SEQUENCE fun Sequence.filter(predicate: (T) -> Boolean): Sequence { return FilteringSequence(this, true, predicate) }

Slide 84

Slide 84 text

FILTER SEQUENCE internal class FilteringSequence(private val sequence: Sequence, private val sendWhen: Boolean = true, private val predicate: (T) -> Boolean ) : Sequence { override fun iterator(): Iterator = object : Iterator { 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 } } }

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { 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 } }

Slide 88

Slide 88 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { 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 } }

Slide 89

Slide 89 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { 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 } }

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { 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 } }

Slide 96

Slide 96 text

ITERATOR ࠗ࠙ SEQUENCE override fun iterator(): Iterator = object : Iterator { 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 } }

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

FOREACH SEQUENCE fun Sequence.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }

Slide 99

Slide 99 text

਋ܻо ࢓ಝࠅ ௏٘! SEQUENCE fun Sequence.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) } Terminate Sequence method

Slide 100

Slide 100 text

੿ܻೞݶ! SEQUENCE Sequence੄ chaining਷ ૊п੸ਵ۽ ۽૒੉ ࣻ೯غח Ѫ੉ ইצ Terminate methodо ഐ୹ ؼ ٸ ೧׼ methodী ٮܲ Ѿҗ ч੉ ഐ୹غח lazy initializeߑध ੑפ׮. ٮۄࢲ ੘਷ ࢎ੉ૉܳ о૑Ҋ ੓ਸ ҃਋ listࠁ׮ ো࢑੉ ו۰૕ ࣻ ੓ਵա ୽࠙൤ ݆਷ ন੄ ࢎ੉ૉ ഑਷ find, firstэ਷ ౠ੿ чਸ ߈ജ߉Ҋ रਸ ٸীח ؊ ബҗ੸ੌ ࣻ ੓णפ׮.

Slide 101

Slide 101 text

OBSERVABLE

Slide 102

Slide 102 text

OBSERVABLE੄ CHAINING਷.. OBSERVABLE п chain݃׮ ঌݏ਷ Observable৬ ؀਽ೞח Observer,Disposeableਸ ٜ݅য subscribeػ ٍ, ই੉మ੉ ߊ೯غݶ ୐ߣ૩ chainࠗఠ ݃૑݄ө૑ пп੄ Obsever۽૒੉ ࣻ೯غয Ѿҗޛ੉ ߈ജغח ߑध

Slide 103

Slide 103 text

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)

Slide 104

Slide 104 text

޷ܻ ঌই ل ࢎ೦ٜ OBSERVABLE ObjectHelper : ೧׼ ё୓о Nullੋ૑ ౸ױೞৈ Exceptionਸ thorw೧઱ח ৉ೡ੄ Helper RxJavaPlugins : RxJava Libraryীࢲ ݽٚ Streamী ؀ೞৈ ҕ ా੸ਵ۽ ୊ܻೞҊ र਷ ۽૒੉ ੓ਸٸ ࢎਊೞח Plugin ௥ೞѱ झఈೞѷणפ׮.

Slide 105

Slide 105 text

௏٘о ցޖ ӡযਃ.. OBSERVABLE IDE۽ ૒੽ э੉ ࠁѷणפ׮!

Slide 106

Slide 106 text

੿ܻೞݶ.. OBSERVABLE Observable੄ ই઱ ӝࠄ੸ੋ chainingߑध੉ যڌѱ ҳഅ غয੓ח૑݅ਸ ঌইࠄ Ѫ੉ӝ ٸޙী Hot stream, subject١ਸ पઁ۽ ࢎਊ೧ ࠁݴ ղࠗ ҳഅ ௏٘ܳ ੉೧೧ ࠁदחѦ ୶ୌ ೤פ׮ :)

Slide 107

Slide 107 text

ҡଳওաਃ..?

Slide 108

Slide 108 text

Q&A

Slide 109

Slide 109 text

Thank You!