Slide 1

Slide 1 text

SequenceͱCorou*neͷ࿩ @RyotaMurohoshi 2017/04/04'ୈ5ճ'Kotlinษڧձ'@SanSan

Slide 2

Slide 2 text

ࣗݾ঺հ @RyotaMurohoshi Kotlin͕޷͖Ͱ͢ɻC#΋޷͖Ͱ͢ɻ

Slide 3

Slide 3 text

SequenceͬͯԿʁ

Slide 4

Slide 4 text

Sequence ίϨΫγϣϯΠϯλʔϑΣʔε public interface Sequence { public operator fun iterator(): Iterator }

Slide 5

Slide 5 text

Sequenceʹ͸ɺList΍Arrayͱಉ͡Α͏ʹ map΍filterͱ͍֦ͬͨுؔ਺͕͋Γ·͢

Slide 6

Slide 6 text

Ͱ΋ڍಈ͕େ͖͘ҧ͍·͢

Slide 7

Slide 7 text

Listͷmapɾfilterͷڍಈ val list : List = listOf(0, 1, 2, 3) val converted = list .filter { println("filter $it") it.rem(2) == 0 } .map { println("map $it") it } println("--------") for(it in converted) println("for $it")

Slide 8

Slide 8 text

Listͷmapɾfilterͷڍಈ filter 0 filter 1 filter 2 filter 3 map 0 map 2 -------- for 0 for 2

Slide 9

Slide 9 text

Listͷmap΍filter͸ɺ શཁૉʹରͯؔ͠਺Ϧςϥϧ͕ଈ࠲ʹద༻͞Ε·͢

Slide 10

Slide 10 text

࣍͸Sequence

Slide 11

Slide 11 text

Sequenceͷmapɾfilterͷڍಈ val sequence : Sequence = sequenceOf(0, 1, 2, 3) val converted = sequence .filter { println("filter $it") it.rem(2) == 0 } .map { println("map $it") it } println("--------") for(it in converted) println("for $it")

Slide 12

Slide 12 text

-------- filter 0 map 0 for 0 filter 1 filter 2 map 2 for 2 filter 3

Slide 13

Slide 13 text

Sequenceͷmapɾfilter͸ ͦͷཁૉ͕ඞཁʹͳͬͨλΠϛϯάͰ ؔ਺Ϧςϥϧ͕ద༻͞Ε·͢

Slide 14

Slide 14 text

JavaͷStream)API C#ͷLINQ ʹࣅͯ·͢Ͷ

Slide 15

Slide 15 text

ʮͰɺ࣮ࡍ࢖͏৔໘͋Δͷʁʯ

Slide 16

Slide 16 text

͋ΔΜͰ͢ʂ

Slide 17

Slide 17 text

࣮ࡍʹSequenceͷ׆༂͢Δ৔໘ • ϑΝΠϧͷ1ߦͣͭಡΈࠐΈ#File.useLines • σΟϨΫτϦͷϑΝΠϧ୳ࡧ#FireTreeWalk

Slide 18

Slide 18 text

͢΂ͯ࠷ޙ·ͰҰؾʹ΍Δඞཁ͕ͳ͍ ͦ͏͍͏࣌ʹ׆༂

Slide 19

Slide 19 text

Sequence͕ͲΜͳ΋ͷ͔ɺ ͲΜͳ৔໘Ͱ׆༂͢Δ͔Θ͔Γ·ͨ͠Ͷʁ

Slide 20

Slide 20 text

࣍͸ɺ͖ͬ͞ͷfilterͷ࣮૷ΛݟͯΈ·͠ΐ͏

Slide 21

Slide 21 text

Listͷfilterͷ࣮૷ ࣮ࡍʹ͸Iterableͷfilter

Slide 22

Slide 22 text

୯७ɻͦͷ·Μ· ৽ͨͳArrayListΛ࡞ͬͯɺforͯ͠ɺifͯ͠ɺaddͯ͠

Slide 23

Slide 23 text

List(Iterable)ͷfilterͷ࣮૷ public inline fun Iterable.filter(predicate: (T) -> Boolean): List { return filterTo(ArrayList(), predicate) } public inline fun > Iterable .filterTo(destination: C, predicate: (T) -> Boolean): C { for (element in this) if (predicate(element)) destination.add(element) return destination } h"ps:/ /github.com/JetBrains/kotlin/blob/v1.1.1/libraries/stdlib/src/generated/_Collec=ons.kt>ΑΓ Πϯσϯτ͸ม͍͑ͯ·͢

Slide 24

Slide 24 text

୯७ɻͦͷ·Μ· ৽ͨͳArrayListΛ࡞ͬͯɺforͯ͠ɺifͯ͠ɺaddͯ͠

Slide 25

Slide 25 text

͡Ό͊ɺSequence͸ʁ

Slide 26

Slide 26 text

Sequenceͷfilterͷ࣮૷͸ʁ public fun Sequence.filter(predicate: (T) -> Boolean): Sequence { return FilteringSequence(this, true, predicate) } h"ps:/ /github.com/JetBrains/kotlin/blob/v1.1.1/libraries/stdlib/src/generated/_Sequences.kt#L307

Slide 27

Slide 27 text

;Ή;ΉɻͳΔ΄Ͳɻ FilteringSequenceͷ࣮૷͸ʁ

Slide 28

Slide 28 text

FilteringSequenceͷ࣮૷ 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 return result as T } override fun hasNext(): Boolean { if (nextState == -1) calcNext() return nextState == 1 } } }

Slide 29

Slide 29 text

௕͍ʂ

Slide 30

Slide 30 text

IteratorΛ࣮૷͠ͳ͍ͱ͍͚ͳ͍ ௕͘ͳͬͯ͠·͏

Slide 31

Slide 31 text

େม

Slide 32

Slide 32 text

ࠓ೔ͷςʔϚ͸Kotlin'1.1 ͓଴ͨͤ͠·ͨ͠

Slide 33

Slide 33 text

Kotlin1.1ͰCorou,neಋೖ (·ͩexperimentalͬͯ෇͍͍ͯΔ͚Ͳʂ)

Slide 34

Slide 34 text

filterͱಉ༷ͷॲཧ͸ɺ΋͏௕ʑॻ͔ͳͯ͘΋࣮૷Ͱ͖Δ

Slide 35

Slide 35 text

Corou%neΛ࢖ͬͯ SequenceͷfilterΛॻ͘ͱʁ

Slide 36

Slide 36 text

Kotlin'1.1ͰSequenceͷfilter fun Sequence.where(predicate: (T) -> Boolean): Sequence = buildSequence { for (element in iterator()) { if (predicate(element)) { yield(element) } } }

Slide 37

Slide 37 text

buildSequenceʂ ͦͯ͠yieldʂ

Slide 38

Slide 38 text

forͯ͠ifͯ͠ ௚ײతͰ͠ΐʁ

Slide 39

Slide 39 text

Kotlin'1.1ͰSequenceͷfilter fun Sequence.where(predicate: (T) -> Boolean): Sequence = buildSequence { for (element in iterator()) { if (predicate(element)) { yield(element) } } }

Slide 40

Slide 40 text

͜ΕͰSequenceΛ؆୯ʹ࡞ΕΔ

Slide 41

Slide 41 text

Generator ʢͱ͔ݴΘΕͯΔΒ͍͠ʣ

Slide 42

Slide 42 text

buildSequenceͷڍಈΛprintlnͰ

Slide 43

Slide 43 text

val sequence: Sequence = buildSequence { println("before A") yield("A") println("before B") yield("B") println("last") } println("-----------") for (element in sequence) { println("for $element") }

Slide 44

Slide 44 text

----------- before A for A before B for B last

Slide 45

Slide 45 text

ϙΠϯτ͸!தஅ!ͱ!࠶։

Slide 46

Slide 46 text

val sequence: Sequence = buildSequence { println("before A") yield("A") println("before B") yield("B") println("last") } println("-----------") val iterator = sequence.iterator() println(iterator.hasNext()) println(iterator.next()) println(iterator.hasNext()) println(iterator.next()) println(iterator.hasNext())

Slide 47

Slide 47 text

----------- before A true A before B true B lastfalse

Slide 48

Slide 48 text

GeneratorΛ࢖ͬͯ ͍Ζ͍Ζ࡞ͬͯΈ·͠ΐ͏

Slide 49

Slide 49 text

ແݶUnit

Slide 50

Slide 50 text

ແݶUnit fun infiniteUnitSequence() = buildSequence { while (true) { yield(Unit) } }

Slide 51

Slide 51 text

map

Slide 52

Slide 52 text

map fun Sequence.map(selector: (T) -> R): Sequence = buildSequence { for (element in iterator()) { yield(selector(element)) } }

Slide 53

Slide 53 text

File.useLinesͬΆ͍΍ͭ fun sequenceOfLines(fileName: String) = buildSequence { BufferedReader(FileReader(fileName)).use { while (true) { yield(it.readLine() ?: break) } } } h"ps:/ /github.com/Kotlin/kotlin4corou6nes/blob/master/examples/sequence/sequenceOfLines.kt

Slide 54

Slide 54 text

buffer(count,,skip)

Slide 55

Slide 55 text

val sequence = sequenceOf(0, 1, 2, 3, 4, 5) val buffered = sequence.buffer(3, 2) println(buffered.toList()) // දࣔͷͨΊtoList //[[0, 1, 2],[2, 3, 4], [4, 5]]

Slide 56

Slide 56 text

buffer(count,,skip) fun Sequence.buffer(count: Int, skip: Int): Sequence> = buildSequence { val buffers = LinkedList>() var i = 0 forEach { element -> if (i.rem(skip) == 0) buffers.add(mutableListOf()) for (buffer in buffers) buffer.add(element) if (buffers.size > 0 && buffers.peek().count() == count) yield(buffers.poll().toList()) i++ } yieldAll(buffers) }

Slide 57

Slide 57 text

Ͷʁ buildSequenceؔ਺Λ࢖͑͹؆୯ʹ Sequenceͷؔ਺Λ࡞ΕΔͰ͠ΐʁ

Slide 58

Slide 58 text

·ͱΊ • Sequenceศར • Ͱ΋Kotlin01.0Ͱ͸Sequenceͳϝιουͷ࣮૷໘౗ • Kotlin01.1ͰCorou6neՃΘͬͨ • Corou6ne͸async0/0await͚ͩ͡Όͳ͍ • buildSequenceͰSequenceͳϝιουͷ࣮૷ָʹͰ͖Δ

Slide 59

Slide 59 text

͕࣌ؒڐ͢ݶΓখωλΛ

Slide 60

Slide 60 text

QʮbuildSequenceʁgenerate͡Όͳ͍ͷʁʯ

Slide 61

Slide 61 text

A"ͳΜ͔มΘͬͨͬΆ͍Ͱ͢Αɻ

Slide 62

Slide 62 text

Kotlin/kotlin)corou-nesͷυΩϡϝϯτ͸ 2017/01/17ͰมΘͬͯ·ͨ͠ h"ps:/ /github.com/Kotlin/kotlin4corou6nes/commit/c8232f0cbff664d232fe46c1a554219c482fe10d

Slide 63

Slide 63 text

Q"ʮͲ͏΍ͬͨΒࢼͤΔͷʁʯ

Slide 64

Slide 64 text

A"ʮGenerator(buildSequence)͸ ௥ՃϥΠϒϥϦ͍Βͳ͍Ͱ͢Αʯ ͨͩexperimentalͳcorou.ne͸ܯࠂग़Δ͔Βɺ཈੍ϑϥάΛཱ͍ͯͯͩ͘͞Ͷ h"p:/ /kotlinlang.org/docs/diagnos3cs/experimental7corou3nes.html

Slide 65

Slide 65 text

Q"ʮExperimentalͳͷ?ʯ

Slide 66

Slide 66 text

A"ʮExperimentalͩͦ͏Ͱ͢ʯ

Slide 67

Slide 67 text

Ͳ͏͍͏͜ͱʁ

Slide 68

Slide 68 text

KotlinͷExperimentalͷఆٛʹΑΔͱɺ • 1.1.xͷؒ͸ޙํޓ׵ੑͷอূ͋Γ • 1.2Ͱ͸อূͳ͠ h"ps:/ /kotlinlang.org/docs/reference/compa6bility.html#experimental;features

Slide 69

Slide 69 text

experimental͔ͩΒύοέʔδ͸ kotlin.corou+nes.experimental API͕֬ఆͨ͠Βɺkotlin.corou.nesʹ (ޙํޓ׵ੑͷͨΊkotlin.corou,nes.experimental΋࢒Δ) h"ps:/ /kotlinlang.org/docs/reference/corou6nes.html#experimental:status:of:corou6nes

Slide 70

Slide 70 text

Kotlin'1.1ͷϒϩάΑΓ An#important#note.#With#all#the#benefits#that#they#bring,#Kotlin# corou9nes#are#a#fairly#new#design#that#needs#extensive#ba?le@ tes9ng#before#we#can#be#sure#it’s#100%#right#and#complete.#This#is# why#we#will#release#it#under#an#“experimental”#opt@in#flag.#We#do# not#expect#the#language#rules#to#change,#but#APIs#may#require# some#adjustments#in#Kotlin#1.2.

Slide 71

Slide 71 text

Kotlin'1.1ͷϒϩάΑΓ We#do#not#expect#the#language#rules#to#change,#but#APIs#may# require#some#adjustments#in#Kotlin#1.2.

Slide 72

Slide 72 text

ͳΔ΄ͲɺมΘΔՄೳੑ͸͋Δ

Slide 73

Slide 73 text

·ͱΊ • Sequenceศར • Ͱ΋Kotlin01.0Ͱ͸Sequenceͳϝιουͷ࣮૷໘౗ • Kotlin01.1ͰCorou6neՃΘͬͨ • Corou6ne͸async0/0await͚ͩ͡Όͳ͍ • buildSequenceͰSequenceͳϝιουͷ࣮૷ָʹͰ͖Δ • experimental

Slide 74

Slide 74 text

๻͸·ͣݸਓϥΠϒϥϦ͔ΒΨϯΨϯ࢖͍·͢