シスアーキ in はてな

シスアーキ(自称)の技術ブログ

『あの記事』をKotlinで書き直してみた!

<< 17日目 19日目>>

この記事は Kotlin Advent Calendar 2014 18 日目の記事です。


Kotlin Advent Calendar 2014 - Adventar

 

最近、落ち込んでいます。。

というのもある記事 を書いたけど、当人の反応はイマイチだし、みんなからはダメだしされるし。

なぜなのか  orz

さっぱり検討がつかない。。

 

うん、あれ?この記事、

Javaで書いてね?

そうか!しょぼちむはKotlinアイドルだった!

Javaなんかで書いてんじゃねえよ!

Kotlin以外で書いたからしょぼちむは怒ってたんだ! 

そww れww だww!!!!wwwww*1

なんて俺はバカなんだ。。 

ということで、Kotlinで書き直してみました!*2

 

まずは、

import kotlin.math.*

kotlin.mathパッケージをインポートすることにより、『演算子オーバロード』の機能を使って、BigDecimalリテラル値と同じく四則演算で表現できるようになります!

これで、Javaで書いていた以下の記述は、

new BigDecimal("0.3").multiply(確率)

                   ↓

new BigDecimal("0.3") * 確率 

となります。

また、

inline val String.bd : BigDecimal get() = BigDecimal(this)

と『拡張プロパティ』を用いることで、

new BigDecimal("0.3") * 確率 

                   ↓

"0.3".bd * 確率 

のように、より簡潔にかけるようにしました!

 

可能性のクラスは『データクラス』を用いることでより簡潔に!

data class 可能性<T> (val 選択肢 : T, val 確率 : BigDecimal)

 

データクラス』を用いることで、可能性の中の値を『多重宣言』で取得することも簡単になりました!

val (選択肢, 確率) = しょぼちむの正体

 

staticメソッドもKotlin M9から使える『platformStatic』で定義しました!*3

class object {
  fun とは() : List<可能性<しょぼちむ>> =
    listOf(
        可能性(バイトの女の子, "0.6".bd ),
        可能性(ようおっさん, "0.2".bd ),
        可能性(二年目女子SE, "0.1".bd ),
        可能性(おまえ誰だ, "0.09".bd ),
        可能性(まじレッドキング, "0.01".bd )
    )
}

 

醜いswitch分は値を返すことが出来る『when式』でスッキリ!

return when(選択肢) {
  しょぼちむ.バイトの女の子 ->
    // かわいい!!
    listOf(可能性(おごるよ, "0.9".bd * 確率), 可能性(割り勘, "0.1".bd * 確率))

        :
  else ->
    // お前誰だ?
    listOf(可能性(割り勘, "1.0".bd * 確率))

}

 

Kotlinのリストは、『拡張関数』でflatMapやgroupByなどのJavaのリストにないメソッドも使えます!

  val l = しょぼちむ.とは()
    .flatMap { 正体 -> 支払い.どうする(正体) }
    .flatMap { おごり -> おこづかい.のこるの(おごり) }
    .groupBy { t -> t.選択肢 }
    .map { e ->
        e.key to (e.value.fold ( BigDecimal.ZERO, { (a, n) -> a + n.確率 } )) }

 

なんということでしょう〜!

あれほど醜くかったJavaソースが見違えるように簡潔な記述になりました。

 

全体のソースはこちらです。

Kotlin Advent Calendar 2014 のソース(Main)

 

これでしょぼちむも喜んで見てくれるはずです。

 

しょぼちむ見てる〜〜?(((o(*゚▽゚*)o)))

 

なお、結果はやっぱり金欠でした。

[(金欠だ~ヽ(;▽;)ノ, 0.7110), (金ならあるんだ!!(((o(*゚▽゚*)o))), 0.2790)] 

 

明日は plum_shiga さんの「世界のKotlinを巡る」です!