ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

KotlinでRubyのselectメソッドみたいなやつ作った

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は型が厳しくて面食らいますね。面食らった内容何かをまとめても面白いなと思いました。