Kotlinの勉強二日目で、関数やらラムダ式やらを勉強しました。
関数の引数に関数を渡して色々できるっぽいので「お、じゃあRubyのArrayクラスにあるメソッドっぽいのが作れるのかな」ということでSelectメソッドを作ってみました。
fun select(list: List<Any>, decisionFuncton: (Any) -> Boolean): List<Any>{ var returnList: MutableList<Any> = mutableListOf(); for(item in list) { if(decisionFuncton(item)) returnList.add(item); } return returnList; } fun main(args: Array<String>) { println( select( mutableListOf(1, 12, 21), { it as Int > 20 } ) ); println( select( mutableListOf("hoge", "fuga"), { it as String == "hoge" } ) ); }
実行結果
$ kotlinc test.kt -include-runtime -d test.jar $ kotlinc test.jar [21] [hoge]
どんな型でも使えるようにAny使いまくってますがListから意図した要素を取ってこれました。
selectメソッドの引数に{it as Int > 20}
のように判定用のメソッドを渡しています。
おまけ
ジェネリクスを使って型を指定できるようにしました。
as
を使ってキャストする必要が無いのでこっちのが良いかも?
fun <T> select(list: List<T>, decisionFuncton: (T) -> Boolean): List<T>{ var returnList: MutableList<T> = mutableListOf(); for(item in list) { if(decisionFuncton(item)) returnList.add(item); } return returnList; } fun main(args: Array<String>) { println( select<Int>( mutableListOf(1, 12, 21), { it > 20 } ) ); println( select<String>( mutableListOf("hoge", "fuga"), { it == "hoge" } ) ); }
Ruby出身からするとKotlinは型が厳しくて面食らいますね。面食らった内容何かをまとめても面白いなと思いました。