リストの中から、条件にマッチした最初のアイテムが何番目かを返すやつ

Kotlin で、「リストの中から、条件にマッチした最初のアイテムが何番目かを知りたい」のだけど、既定のコレクションクラスにはそんな機能はないみたいだったので、作ってみた。

拡張メソッド

inline fun <T> Iterable<T>.firstIndexOrNull(predicate: (T) -> Boolean): Int? {
    return this.mapIndexed { index, item -> Pair(index, item) }
            .firstOrNull() { predicate(it.second) }
            ?.first
}

.mapIndexed でインデックス付きの要素に変換して、ヒットしたらそのインデックスを返してるだけですね。

使い方

val arr = arrayListOf("a", "b", "c")

arr.firstIndexOrNull { it == "b"} // -> 1
arr.firstIndexOrNull { it == "z"} // -> null

ヒットしなかったら -1 というのは悪手だと思う。 nullable があるのだから使おう。