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

Kotlin 1.1 Standard Libraryの改善

Kotlin 1.1 Standard Libraryの改善

2017/06/29(木)に開催された 「第6回Kotlin勉強会 @ Sansan」の発表資料です。

RyotaMurohoshi

June 29, 2017
Tweet

More Decks by RyotaMurohoshi

Other Decks in Technology

Transcript

  1. Kotlin'1.1'Standard'Libraryͷվળ
    @RyotaMurohoshi
    2017/06/29(ୈ6ճ(Kotlinษڧձ(@SanSan

    View Slide

  2. ॕ!Early!access!program!for!Kotlin!1.2!։࢝ʂ
    h"ps:/
    /blog.jetbrains.com/kotlin/2017/06/early

    View Slide

  3. ͚ΕͲࠓ೔͸ɺKotlin'1.1ͷ࿩Λ͠·͢

    View Slide

  4. Kotlin'1.1ͱݴ͑͹ɽɽɽ

    View Slide

  5. Kotlin'1.1ͱݴ͑͹
    • Corou&nes(experimental)
    • Type5aliases
    • Bound5callable5references
    • Sealed5and5data5classes
    ͳͲͳͲɽɽɽ

    View Slide

  6. ͦ͏͍͏ݴޠػೳ͚ͩͰͳ͘ɺ
    Standard'Libraryʹ΋͍Ζ͍Ζ௥Ճ͞Ε͍ͯ·͢

    View Slide

  7. What's'New'in'Kotlin'1.1
    Standard'library'ΑΓ
    h"ps:/
    /kotlinlang.org/docs/reference/whatsnew11.html#standard9library

    View Slide

  8. String'to'number'conversions

    View Slide

  9. val numString : String = loadString()
    // ΋͔ͨ͠͠ΒParseࣦഊͯ͠
    // NumberFormatException͕౤͛ΒΕΔ͔΋
    val num: Int = numString.toInt()

    View Slide

  10. ͦ͜ͰɺtoIntOrNull

    View Slide

  11. val numString : String = loadString()
    // Parseࣦഊͨ͠Βnull
    val num:Int? = numString.toIntOrNull()

    View Slide

  12. // ؀ڥม਺Λύʔε͢Δ͚Ͳɺ
    // ࣦഊͨ͠Β80൪ʹ
    val port = System.getenv("PORT")?.toIntOrNull() ?: 80

    View Slide

  13. • toDoubleOrNull
    • toFloatOrNull
    • toShortOrNull
    • toLongOrNull
    • toByteOrNull
    ੔਺͸ج਺Λࢦఆ͢ΔΦʔόʔϩʔυ΋͋ΔΑ

    View Slide

  14. onEach()

    View Slide

  15. onEach()
    ֤छίϨΫγϣϯͷ֦ுؔ਺
    forEach͡Όͳͯ͘ɺonEachͰ͢ʂ

    View Slide

  16. forEach
    val unit: Unit = listOf(1, 2, 3)
    .map { it * it }
    .forEach { println(it) }
    ࣮ߦ݁Ռ͸
    1
    4
    9

    View Slide

  17. onEach
    val list: List = listOf(1, 2, 3)
    .map { it * it }
    .onEach { println(it) }
    ࣮ߦ݁Ռ͸
    1
    4
    9

    View Slide

  18. ࣅ͍ͯ·͢Ͷ

    View Slide

  19. val unit: Unit = listOf(1, 2, 3)
    .map { it * it }
    .forEach { println(it) }
    val list: List = listOf(1, 2, 3)
    .map { it * it }
    .onEach { println(it) }

    View Slide

  20. ͓Θ͔Γ͍͚ͨͩ·͔ͨ͠ʁ

    View Slide

  21. forEach͸Unit
    onEach͸List

    View Slide

  22. ίϨΫγϣϯͷϝιουνΣʔϯͷ్தͰɺ֤ཁૉʹॲཧΛߦ͏ϝιουɻ
    ฦΓ஋͸ݩͷίϨΫγϣϯɻ
    ίϨΫγϣϯࣗମͷ஋͸มΘΒͳ͍ɻ
    ෭࡞༻͕͋Δϝιουͱ͔΋ɻRxͷdoΈ͍ͨ

    View Slide

  23. Sequenceͷ৔߹ɺ
    ཁૉ΁ͷద༻ɾධՁ͸ଈ࣌Ͱ͸ͳ͍Ͱ͢ʂ

    View Slide

  24. val sequence: Sequence =sequenceOf(1, 2, 3)
    .onEach { println(it) }
    .map { it * it }
    .onEach { println(it) }
    println("============")
    for (e in sequence){
    println("$e in for")
    }

    View Slide

  25. ============
    1
    1
    1 in for
    2
    4
    4 in for
    3
    9
    9 in for

    View Slide

  26. ͿͬͪΌ͚ίʔυݟͨํ͕ૣ͍Ͱ͢Ͷ
    @SinceKotlin("1.1")
    public inline fun > C.onEach(action: (T) -> Unit): C {
    return apply { for (element in this) action(element) }
    }

    View Slide

  27. also/takeIf/takeUnless

    View Slide

  28. ίʔυݟͨํ͕Θ͔Γ΍͍͢ʂ
    takeIfͱtakeUnless
    /**
    * Returns `this` value if it satisfies the given [predicate] or `null`, if it doesn't.
    */
    @kotlin.internal.InlineOnly
    @SinceKotlin("1.1")
    public inline fun T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null
    /**
    * Returns `this` value if it _does not_ satisfy the given [predicate] or `null`, if it does.
    */
    @kotlin.internal.InlineOnly
    @SinceKotlin("1.1")
    public inline fun T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null

    View Slide

  29. val evenOrNull: Int? = 2.takeIf { it % 2 == 0 }
    Assert.assertEquals(2, evenOrNull)
    val oddOrNull: Int? = 2.takeUnless { it % 2 == 0 }
    Assert.assertEquals(null, oddOrNull)

    View Slide

  30. also͸applyʹࣅ͍ͯΔ
    ͚ΕͲ
    ϥϜμࣜͷதͷthisͷҙຯ͕ҧ͏

    View Slide

  31. val bundleB = Bundle().apply {
    // ͜͜Ͱthis͸Bundle
    putString("KEY1", "VALUE1")
    this.putString("KEY2", "VALUE2")
    // ίϯύΠϧΤϥʔ
    //it.putString("KEY3", "VALUE3")
    }

    View Slide

  32. val bundleA = Bundle().also {
    // ͜͜Ͱthis͸Bundleͷ֎ଆ
    it.putString("KEY1", "VALUE1")
    // ίϯύΠϧΤϥʔ
    //putString("KEY2", "VALUE2")
    // ίϯύΠϧΤϥʔ
    //this.putString("KEY3", "VALUE3")
    }

    View Slide

  33. ίʔυݟͨํ͕Θ͔Γ΍͍͢ʂ
    applyͱalso
    /**
    * Calls the specified function [block] with `this` value as its receiver and returns `this` value.
    */
    @kotlin.internal.InlineOnly
    public inline fun T.apply(block: T.() -> Unit): T { block(); return this }
    /**
    * Calls the specified function [block] with `this` value as its argument and returns `this` value.
    */
    @kotlin.internal.InlineOnly
    @SinceKotlin("1.1")
    public inline fun T.also(block: (T) -> Unit): T { block(this); return this }

    View Slide

  34. groupingBy()

    View Slide

  35. ฦΓ஋ܕ͸৽ΠϯλʔϑΣʔε!Grouping
    interface Grouping

    View Slide

  36. Grouping͸άϧʔϓԽͯ͠
    ͝ʹΐ͝ʹΐॲཧΛ͢ΔͨΊͷ
    தؒͷσʔλߏ଄Λ࢘ΔΠϯλʔϑΣʔε

    View Slide

  37. • aggregate
    • fold
    • reduce
    • eachCount
    ͳͲͳͲ

    View Slide

  38. groupBy͍ͬͯ͏ϝιου͋Γ·ͨ͠ΑͶʁ
    data class ScoreRecord(
    val stageId: Int,
    val score: Int
    )
    val scoreRecordList = listOf(
    ScoreRecord(stageId = 0, score = 1),
    ScoreRecord(stageId = 0, score = 3),
    ScoreRecord(stageId = 1, score = 2),
    ScoreRecord(stageId = 0, score = 1),
    ScoreRecord(stageId = 2, score = 4)
    )
    val map: Map> = scoreRecordList.groupBy { it.stageId }

    View Slide

  39. groupingByͱfoldͳͲͰɺ
    ΋ͬͱॊೈʹ

    View Slide

  40. val sumScores: Map = scoreRecordList
    .groupingBy { it.stageId }
    .fold(0, { acc, elm -> acc + elm.score })
    val maxScores: Map = scoreRecordList
    .groupingBy { it.stageId }
    .fold(0, { acc, elm -> maxOf(acc, elm.score) })

    View Slide

  41. toMap()(ͱ(toMutableMap()

    View Slide

  42. toMap()(ͱ(toMutableMap()
    MapͷίϐʔΠϯελϯεੜ੒ϝιου
    val original = mutableMapOf(1 to "A", 2 to "B")
    val copied = original.toMap()
    original[3] = "C"
    Assert.assertEquals(3, original.size)
    Assert.assertEquals(2, copied.size)

    View Slide

  43. Map.minus(key)

    View Slide

  44. Kotlin'1.1ͷલʹ΋ɺ+ΦϖϨʔλ͸͋ͬͨ
    val map = mapOf(1 to "A", 2 to "B")
    // Kotlin 1.0Ͱ΋
    // +ΦϖϨʔλʔͰཁૉΛ௥Ճͨ͠৽ͨͳMapΛੜ੒Ͱ͖ͨ
    val added = map + (3 to "C")

    View Slide

  45. Kotlin'1.1͔Βɺ*ΦϖϨʔλ͕ՃΘͬͨ
    val map = mapOf(1 to "A", 2 to "B")
    // Kotlin 1.1͔Β
    // -ΦϖϨʔλʔͰࢦఆͨ͠ΩʔͷཁૉΛ࡟আͨ͠
    // ৽ͨͳMapΛੜ੒Ͱ͖ΔΑ͏ʹ
    val added = map - 1

    View Slide

  46. minOf()(ͱ(maxOf()

    View Slide

  47. ໊લͷ௨Γʂ
    minOf&:&Ҿ਺ʹ౉ͨ͠΋ͷ͔Β࠷খ஋Λฦ͢
    maxOf&:&Ҿ਺ʹ౉ͨ͠΋ͷ͔Β࠷େ஋Λฦ͢
    2Ҿ਺όʔδϣϯͱ3Ҿ਺όʔδϣϯ͕͋Δ

    View Slide

  48. val min = minOf(1, 2)
    val max = maxOf(2.3, 5.1, 4.7)

    View Slide

  49. ComparableΛ࣮૷ͨ͠΋ͷ΋Ͱ͖Δ
    val min = minOf(
    LocalDate.parse("2017-07-21"),
    LocalDate.parse("2017-07-20")
    )

    View Slide

  50. ൺֱ৚݅ΛҾ਺ͱͯ͠ࢦఆ΋Ͱ͖Δ
    val alphabetical = minOf(
    "Java",
    "Kotlin",
    "Android"
    )
    val length = minOf(
    "Java",
    "Kotlin",
    "Android",
    Comparator { a, b -> a.length - b.length }
    )

    View Slide

  51. Array%like*List*instan/a/on*
    func/ons

    View Slide

  52. Kotlin'1.0͔Β
    ࣮͸഑ྻͷॳظԽɺ͜Μͳײ͡Ͱ͔͚ͨ
    val zeroFilledZize10 = Array(size=10) { 0 }
    val indexedFilled = Array(size=3) {index -> index }

    View Slide

  53. ͜ΕʹࣅͨListͱMutableListΛੜ੒͢Δ
    ʮؔ਺ʯ͕Kotlin'1.1͔ΒՃΘͬͨ
    val zeroFilledSize10 = MutableList(size=10) { 0 }
    val squaredIndexList = List(size = 4) { it * it }

    View Slide

  54. େจࣈͰ࢝·Δ͚Ͳ
    Ϋϥε໊͡Όͳͯ͘ɺؔ਺ͷ໊લʂ

    View Slide

  55. Map.getValue()

    View Slide

  56. val map: Map = mapOf(1 to "A", 2 to "B")
    // 0ͱ͍͏Ωʔ͸ͳ͍͔ΒɺnullΛฦ͢
    val valueOrNull : String? = map[0]
    // 0ͱ͍͏Ωʔ͸ͳ͍͔ΒɺNoSuchElementExceptionΛ౤͛Δ
    val value: String = map.getValue(0)

    View Slide

  57. Abstract(collec,ons

    View Slide

  58. Abstract(collec,ons
    ίϨΫγϣϯͷந৅Ϋϥε
    • AbstractCollec-on/
    • AbstractList
    • AbstractSet
    • AbstractMap

    View Slide

  59. Abstract(collec,ons
    ίϨΫγϣϯͷந৅Ϋϥε
    • AbstractMutableCollec/on
    • AbstractMutableList
    • AbstractMutableSet
    • AbstractMutableMap

    View Slide

  60. java.u&l.AbstractCollec&onͬͯ͋Γ·ͨ͠ΑͶʁ

    View Slide

  61. JVMͰ͸ɺ
    kotlin.collec*ons.MutableܥͷίϨΫγϣϯ͸ɺ
    java.utl.AbstractܥͷίϨΫγϣϯΛܧঝ࣮ͯ͠૷͞Ε͍ͯΔ
    kotlin.collec*ons.AbstractMutableCollec*on͸ɺjava.u*l.AbstractCollec*onΛܧঝ

    View Slide

  62. JavaScriptͰ͸ɺ
    ͜ΕΒͷίϨΫγϣϯΛܧঝ֤ͯ͠छίϨΫγϣϯΛ࡞͍ͬͯΔ
    kotlin.collec*ons.ArrayList͸ɺkotlin.collec*ons.AbstractMutableListΛܧঝ͍ͯ͠Δ

    View Slide

  63. Kotlin'1.1͔Βొ৔
    kotlin.collec*ons.ArrayList
    JVMͰ͸ɺjava.u)l.ArrayListͷtypealias
    JavaScriptͰ͸ɺkotlin.collec0ons.AbstractMutableListΛܧঝͨ͠Ϋϥε

    View Slide

  64. ίϨΫγϣϯ͚ͩ͡Όͳͯ͘ɺExcep&onܥ΋
    JVMͰ͸typealiasɺJavaScriptͰ͸ಠࣗఆٛ
    ClassCastExcep+on,IllegalStateExcep+on

    View Slide

  65. Array%manipula,on%func,ons

    View Slide

  66. ഑ྻͷཁૉ͝ͱ͝ʹΐ͝ʹΐ͢Δϝιου͕
    Standard'Libraryʹ

    View Slide

  67. ഑ྻͷtoString()
    println(arrayOf(1, 2, 3).toString())
    ࣮ߦ݁Ռ
    Ljava.lang.Integer;@46ee7fe8

    View Slide

  68. ͍΍ɺ͜Ε͕ݟ͍ͨΜ͡Όͳͯ͘orz

    View Slide

  69. ͦ͜ͰcontentToStringͰ͢Α

    View Slide

  70. ഑ྻͷcontentToString()
    println(arrayOf(1, 2, 3).contentToString())
    ࣮ߦ݁Ռ
    [1, 2, 3]

    View Slide

  71. equalsͱcontentEquals΋
    // false
    println(arrayOf(1, 2, 3).equals(arrayOf(1, 2, 3)))
    // true
    println(arrayOf(1, 2, 3).contentEquals(arrayOf(1, 2, 3)))

    View Slide

  72. ͍͍Ͷʂ

    View Slide

  73. ·ͱΊ

    View Slide

  74. Standard'Library
    ஍ຯʹ͔ͬ͠ΓਐԽ͍ͯͨͥ͠ʂ

    View Slide

  75. ͓·͚
    kotlin'stdlib'jre8ͰStream2APIͱ͔΋

    View Slide