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 があるのだから使おう。