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

Sequenceの話 ~kotlin.sequences.Sequence~

 Sequenceの話 ~kotlin.sequences.Sequence~

2016/07/01(金) 第3回 Kotlin 勉強会 @Sansanの発表した資料です

RyotaMurohoshi

July 01, 2016
Tweet

More Decks by RyotaMurohoshi

Other Decks in Programming

Transcript

  1. Sequenceͷ࿩
    @RyotaMurohoshi
    2016/07/01'ୈ3ճ'Kotlinษڧձ'@SanSan

    View Slide

  2. ໰୊
    ࣍ͷίʔυΛ࣮ߦ͢ΔͱɺͲ͏දࣔ͞ΕΔͰ͠ΐ͏͔ʁ
    ೋͭͷબ୒ࢶ͔ΒબΜͰ͍ͩ͘͞

    View Slide

  3. val list = listOf(1, 2, 3)
    val converted = list.map {
    println("map $it")
    it
    }
    println("--------")
    for(it in converted) println("for $it")

    View Slide

  4. બ୒ࢶ1
    map 1
    map 2
    map 3
    --------
    for 1
    for 2
    for 3

    View Slide

  5. બ୒ࢶ2
    --------
    map 1
    for 1
    map 2
    for 2
    map 3
    for 3

    View Slide

  6. ͲͬͪͰ͠ΐ͏ʁ

    View Slide

  7. ౴͑͸
    બ୒ࢶ1

    View Slide

  8. kotlin.collections.Listͷmapϝιου͸
    શཁૉΛଈ࠲ʹࣹӨ͠·͢

    View Slide

  9. ͍ͭͮͯͷ໰୊
    ࣍ͷίʔυΛ࣮ߦ͢ΔͱɺͲ͏දࣔ͞ΕΔͰ͠ΐ͏͔ʁ

    View Slide

  10. val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
    val result = list
    .map {
    println("map $it")
    it
    }
    .filter {
    println("filter $it")
    it % 2 == 0
    }
    .take(3)
    println("--------")
    for(it in result) println("for $it")

    View Slide

  11. kotlin.collections.Listͷfilterϝιου΋
    mapϝιουͱಉ༷ʹଈ࠲ʹબ୒ॲཧ͕ߦΘΕ·͢
    ɹ
    ͱ͍͏͜ͱ͸...

    View Slide

  12. map 1
    map 2
    /* தུ */
    map 9
    filter 1
    filter 2
    /* தུ */
    filter 9
    --------
    for 2
    for 4
    for 6

    View Slide

  13. kotlin.collections.Listͷ֤ϝιουͱ
    Java8ͷStream*API΍C#ͷLINQͷҧ͍ʹ஫ҙ

    View Slide

  14. ࠷ޙͷ໰୊Ͱ͢

    View Slide

  15. 100000ߦͷJSON'LinesϑΝΠϧ
    ͜ΕΛ1ߦͣͭdataΫϥεͷΦϒδΣΫτʹม׵͠
    ͋Δ৚݅Λຬͨ͢ΦϒδΣΫτΛ
    ࠷ॳ͔Β10͚݅ͩ֬ೝද͍ࣔͨ͠

    View Slide

  16. val lineList: List =
    File("data.jsonlines").readLines()
    val result = lineList
    .map { convertToData(it) }
    .filter { filterData(it) }
    .take(10)
    for (it in result) {
    println(it)
    }

    View Slide

  17. ໰୊
    ɹ
    Կ͕Α͘ͳ͍Ͱ͔͢ʁ

    View Slide

  18. ౴͑
    10݅ͷσʔλ͕ཉ͍͠ͷʹɺ
    100000ߦͷσʔλɺ
    શͯಡΈࠐΜͰ͠·͍ͬͯΔ

    View Slide

  19. ͦ͜ͰSequenceͰ͢Α

    View Slide

  20. package kotlin.sequences
    public interface Sequence {
    public operator fun iterator(): Iterator
    }
    ίϝϯτ͸ൈ͍ͯ·͕͢ɺҎԼΑΓ
    h"ps:/
    /github.com/JetBrains/kotlin/blob/1.0.2/libraries/stdlib/src/kotlin/collec

    View Slide

  21. Sequences.ktʹ͸
    map΍filterɺcountɺtakeͳͲ
    ଟ͘ͷ֦ுؔ਺͕ఆٛ͞Ε͍ͯ·͢

    View Slide

  22. val list = listOf(1, 2, 3)
    val sequence = list.asSequence() // ஫໨ʂ
    val result = sequence
    .map {
    println("map $it")
    it
    }
    println("--------")
    for (it in result) println("for $it")

    View Slide

  23. --------
    map 1
    for 1
    map 2
    for 2
    map 3
    for 3

    View Slide

  24. ཁૉͷࣹӨ͸
    forͰΠςϨʔτ͞ΕඞཁʹͳͬͨλΠϛϯάͰ
    ߦΘΕ·͢

    View Slide

  25. // listOfͰͳ͘ɺsequenceOfʂ
    val sequence = sequenceOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
    val converted = sequence
    .map {
    println("map $it")
    it
    }
    .filter {
    println("filter $it")
    it % 2 == 0
    }
    .take(3)
    println("--------")
    for(it in converted) println("for $it")

    View Slide

  26. --------
    map 1
    filter 1
    map 2
    filter 2
    for 2
    map 3
    /*தུ*/
    map 5
    filter 5
    map 6
    filter 6
    for 6

    View Slide

  27. ϑΝΠϧͷྫ΋ݟͯΈ·͠ΐ͏ʂ

    View Slide

  28. ͓͞Β͍
    100000ߦͷJSON'LinesϑΝΠϧ
    ͜ΕΛ1ߦͣͭdataΫϥεͷΦϒδΣΫτʹม׵͠
    ͋Δ৚݅Λຬͨ͢ΦϒδΣΫτΛ
    ࠷ॳ͔Β10͚݅ͩ֬ೝද͍ࣔͨ͠

    View Slide

  29. ໰୊఺͸ඞཁͳ͍ͷʹ
    ϑΝΠϧΛશ෦ಡΜͰ͠·͏͜ͱ

    View Slide

  30. val result: List = File("data.jsonlines")
    .useLines { lineSequences: Sequence ->
    lineSequences
    .map { convertToData(it) }
    .filter { filterData(it) }
    .take(10)
    .toList()
    }
    for (it in result) {
    println(it)
    }

    View Slide

  31. ϙΠϯτʂʂʂ
    val result: List = File("data.jsonlines")
    .useLines { lineSequences: Sequence ->
    /*ུ*/
    }
    ͜ΕͰϑΝΠϧશ෦ΛಡΈࠐ·ͳ͍ʂʂʂ

    View Slide

  32. ͱ͍͏͜ͱͰҰճ·ͱΊ

    View Slide

  33. ৔໘ʹԠͯ͡ద੾ʹ࢖͓͏ʂ
    • Listͷmap΍filterͱ͔͸ͦͷ৔ͰશཁૉΛॲཧ
    • Sequenceͷmap΍filterͱ͔͸ඞཁʹͳͬͨཁૉΛॲཧ

    View Slide

  34. ͱ͜ΖͰ...

    View Slide

  35. Sequenceͷfilterͷ࣮૷͸...

    View Slide

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

    View Slide

  37. ;Ή;ΉɺͳΔ΄Ͳ
    FilteringSequenceͷ࣮૷͸ʁ

    View Slide

  38. 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
    }
    }
    }

    View Slide

  39. ͳ͛͐ʂʂʂ

    View Slide

  40. IteratorΛ࣮૷ͨ͠ΦϒδΣΫτΛ࡞Βͳ͚Ε͹͍͚ͳ͍
    ͍ͨ΁Μʂʂʂʂ

    View Slide

  41. ΋͠Sequenceͷࣗ࡞֦ுؔ਺Λ࡞Δͱͨ͠Βɺ໘౗͍͘͞ʂʂʂ
    ɹ
    ͱ͜Ζ͕...

    View Slide

  42. Kotlin'1.1Ͱ
    SequenceΛͭ͘Δϝιουָ͕ʹ
    ࡞Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΓͦ͏ʂʂʂ

    View Slide

  43. yield/generator
    1.0ϦϦʔε࣌఺Ͱɺgenerator͸༧໿ޠʹͳΓ·ͨ͠Ͷ

    View Slide

  44. yieldɺC#Ͱେ׆༂ʂʂʂ
    LINQ͸͜ͷyield͕׆༻͞Ε͍ͯΔʂ

    View Slide

  45. ࣗݾ঺հ

    View Slide

  46. • @RyotaMurohoshi
    • C#ɾUnity2(Unity෦2ӡӦ)
    • Unity༻ͷLINQϥΠϒϥϦ2UniLinq࡞੒
    • KotlinͷLINQϥΠϒϥϦ2KotLinq࡞੒த

    View Slide

  47. C#erͰ͢!
    LINQ͕޷͖Ͱ͢ʂ
    (Sequence.mapͱ͔ʹ͍ۙίϨΫγϣϯؔ਺܈)

    View Slide

  48. C#ͰyieldΛ࢖ͬͯ
    filterʹ૬౰͢ΔॲཧΛߦ͏ʹ͸ʁ

    View Slide

  49. C#Ͱfilterʹ૬౰͢ΔॲཧΛߦ͏ʹ͸ʁ
    public static IEnumerable Filter (
    this IEnumerable source,
    Func predicate) {
    if (source == null) throw new ArgumentNullException (nameOf(source));
    if (selector == null) throw new ArgumentNullException (nameOf(predicate));
    return source.Filter_ (predicate);
    }
    public static IEnumerable Filter_ (
    this IEnumerable source, Func predicate) {
    foreach (TSource element in source)
    if(predicate(element))
    yield return element;
    }

    View Slide

  50. େࣄͳ෦෼͸͜͜ʂ͜Μͳʹ୹͍ʂ
    public static IEnumerable Filter_ (
    this IEnumerable source, Func predicate) {
    foreach (TSource element in source)
    if(predicate(element))
    yield return element;
    }
    ࣮ࡍʹC#Ͱ࢖ΘΕΔɺWhere͸࠷దԽͷͨΊʹ΋ͬͱ৭ʑ΍ͬͯ·͢

    View Slide

  51. yield࠷ߴʂ

    View Slide

  52. Kotlinͷyield/generatorͨͷ͠ΈͰ͢Ͷʂ
    h"ps:/
    /github.com/Kotlin/kotlin4corou6nes

    View Slide

  53. ΋͔ͨ͠͠Β͜Μͳ෩ʹ୹͘ͳΔ͔ͳʁ
    public fun Sequence.filter(predicate: (T) -> Boolean): Sequence =
    generate {
    for(it in this){
    if(predicate(it)){
    yield(it)
    }
    }
    }

    View Slide

  54. ࣗ࡞Sequence֦ுؔ਺΋ॻ͖΍͘͢ͳΔ͔ͳʁ

    View Slide

  55. એ఻ʂ

    View Slide

  56. C#ͷLINQޓ׵ͷϥΠϒϥϦ
    KotLinq࡞͍ͬͯ·͢ʂʂʂ
    h"ps:/
    /github.com/RyotaMurohoshi/KotLinq

    View Slide

  57. KotLinq
    • (΄΅)LINQޓ׵
    • IterableɺMapɺArrayɺSequence΁ͷ֦ு਺܈
    • ࣹӨɺબ୒ͱ͔தؒૢ࡞ͷϝιουͰ͸SequenceΛฦ͢

    View Slide

  58. ·ͱΊ
    • Sequenceɺ࢖͍Ͳ͜Ζ͕͋ͬͨΒͥͻʂ
    • yield/generator2ָ͠Έʂ
    • KotLinqΛ͓ٓ͘͠ئ͍͠·͢ʂ

    View Slide

  59. ͓·͚

    View Slide

  60. h"ps:/
    /github.com/RyotaMurohoshi/Kollec8on

    View Slide

  61. Μʁ

    View Slide

  62. Kollec&on?

    View Slide

  63. Kollec&on!!!?

    View Slide

  64. ໊લม͑·͢
    (΄ͱΜͲ࡞ͬͯͳ͍Ͱ͕͢)

    View Slide