Slide 1

Slide 1 text

Kotlin
 NullableܕΛϞφυͬΆͯ͘͠Έͨ 2014-04-05 ୈޒ.ޒճ #ौ୩java 
 ௕ᖒ ଠ࿠ @ngsw_taro

Slide 2

Slide 2 text

ॕʂJava8

Slide 3

Slide 3 text

Optional • ʮܭࢉͷࣦഊʯ΍ʮ஋ͷෆࡏʯͷՄೳੑΛදݱ͢Δ • nullͷ୅ΘΓ • (্ख͘࢖͑͹) ͵ΔΆΒͳ͍

Slide 4

Slide 4 text

Optional static Optional toInt(String str) {! ! // Integerʹม׵ͯ͠ฦ͢! }! ————————————————————————————————————————————————! Optional a = getA();! Optional b = ! a.flatMap(Sample::toInt);

Slide 5

Slide 5 text

NPEͷढറ͔Β͸ಀΕΒΕͳ͍ Optional str = null;

Slide 6

Slide 6 text

KotlinͷΞϓϩʔν (ࢿྉ) KotlinͷNull-Safetyػߏʹ͍ͭͯ https://speakerdeck.com/ntaro/kotlin-null-safetyji-gou-nituite

Slide 7

Slide 7 text

Nullableܕ≠Ϟφυ • Nullableܕม਺͸nullΛ୅ೖՄೳͳ͚ͩ • ࢖͑Δϝιου͕૿͑ΔΘ͚Ͱ͸ͳ͍ • NullableܕͷNullableܕͱ͔ೖΕࢠ͸Ͱ͖ͳ͍

Slide 8

Slide 8 text

nullνΣοΫͯ͠৔߹෼͚ fun toInt(str: String): Int? = ...! ——————————————————————————————————————————————! val a: String? = getA()! val b: Int? = if(a != null) toInt(a) else null

Slide 9

Slide 9 text

NullableܕΛϞφυͬΆͯ͘͠Έͨ

Slide 10

Slide 10 text

͜ΕͰ0, fun T.bind(f:(T)->R):R = f(this)

Slide 11

Slide 11 text

NotNull→Nullableͷؔ਺Λద༻Մ fun divide(a: Int, b: Int): Int?! ! ! ! ! ! ! = if(b == 0) null else (a / b)! val partial = (::divide).curried()(100)! ! 2.nullable()?.bind(partial) // => 50! 0.nullable()?.bind(partial) // => null! null?.bind(partial) // => null

Slide 12

Slide 12 text

NotNull→NotNullͷؔ਺Λద༻Մ fun square(i: Int): Int = i * i! ! 4.nullable()?.bind(::square) // => 16! null?.bind(::square) // => null

Slide 13

Slide 13 text

if-else ΛഉআͰ͖ͨʂ // before! val b: Int? = if(a != null) toInt(a) else null! ! // after! val b: Int? = a?.bind(::toInt)

Slide 14

Slide 14 text

Nullableͳؔ਺͸μϝ fun next(i: Int) = i + 1! val nullableNext = ::next.nullable()! ! val a: Int? = 5! nullableNext?.invoke(a) // ܕ͕߹Θͳ͍! a?.bind(nullableNext) // ܕ͕߹Θͳ͍

Slide 15

Slide 15 text

վྑ fun T.bind(f: ((T) -> R)?): R?! = f?.invoke(this)

Slide 16

Slide 16 text

Nullableͳؔ਺΋ద༻Մ fun next(i: Int) = i + 1! val nullableNext = ::next.nullable()! ! val a: Int? = 5! a?.bind(nullableNext) // => 6! a?.bind(null) // => null

Slide 17

Slide 17 text

Applicative Functor fun minus(a: Int, b: Int) = a – b! val minus = ::minus.curried()! ! val a: Int? = 5! val b: Int? = 3! b?.bind(a?.bind(minus)) // => 2

Slide 18

Slide 18 text

͜Μͳؔ਺Λಋೖͯ͠ΈΔ fun ! Function1.apply(nullable: T?): R?! ! ! = nullable?.bind(this)

Slide 19

Slide 19 text

ΑΓ3FBEBCMFͳελΠϧ // before! b?.bind(a?.bind(minus))! ! // after! minus.apply(a)?.apply(b)

Slide 20

Slide 20 text

੒Ռ Ҿ਺͕NotNullͷؔ਺ʹNullableΛ ৯ΘͤΒΕΔΑ͏ʹͳͬͨ ! ! ʮNullνΣοΫͯ͠෼ذʯΛഉআ͠ɺ ಡΈ΍͍͢ίʔυ͕ॻ͚Δ

Slide 21

Slide 21 text

NullableɺͦΜͳʹ໘౗͡Όͳ͍ʂ

Slide 22

Slide 22 text

curried() FunKTionale https://github.com/MarioAriasC/funKTionale

Slide 23

Slide 23 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠