<< 17日目 19日目>>
この記事は Kotlin Advent Calendar 2014 18 日目の記事です。
Kotlin Advent Calendar 2014 - Adventar
最近、落ち込んでいます。。
というのもある記事 を書いたけど、当人の反応はイマイチだし、みんなからはダメだしされるし。
こざけさん……出だしがひどすぎる…w / 『しょぼちむにおごって僕が金欠になるかどうか』をプログラミングしてみた! - シスアーキ in はてな http://t.co/RKJ1fkaYrx
— だいくしー (@daiksy) 2014, 12月 4
なぜなのか 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 さんの記事です!
*1:それじゃない
*2:この記事は Kotlin Advent Calendar の記事です。しょぼちむ Advent Calendar ではありません。