わからないコードを見つけました。
JSONArray
をList
に変換しています。
Kotlinは、関数mapTo
をstdlib
( link )で提供します
mapTo
inline fun <T, R, C : MutableCollection<in R>> Iterable<T>.mapTo( destination: C, transform: (T) -> R ): C (source)
指定された変換関数を元のコレクションの各要素に適用し、結果を指定された宛先に追加します。
この関数には2つのパラメーターがあり、次のように使用できます(予想どおり)。
(0..jsonArray.length() - 1).mapTo(targetList, {it -> jsonArray[it].toString()})
しかし、明らかにこれも有効な構文です(予期されていません):
(0..jsonArray.length()-1).mapTo(targetList) {it -> jsonArray[it].toString()}
ご覧のとおり、関数パラメーターはoutputList
の後に終了し、ラムダ式は関数呼び出しの最後に配置されます。
さらに、これは合法です(予想どおり):
val transformation = {it : Int -> jsonArray[it].toString()}
(0..jsonArray.length()-1).mapTo(targetList, transformation)
しかし、これはそうではありません(???):
val transformation = {it : Int -> jsonArray[it].toString()}
(0..jsonArray.length()-1).mapTo(targetList) transformation
ドキュメント で述べられているように:
Kotlinでは、関数の最後のパラメーターが関数であり、対応する引数としてラムダ式を渡すという規則があります。括弧の外で指定できます。
lock (lock) { sharedResource.operation() }
高階関数の別の例はmap()です。
fun <T, R> List<T>.map(transform: (T) -> R): List<R> { val result = arrayListOf<R>() for (item in this) result.add(transform(item)) return result }
この関数は次のように呼び出すことができます。
val doubled = ints.map { it -> it * 2 }
ラムダがその呼び出しの唯一の引数である場合、呼び出しの括弧は完全に省略できることに注意してください。
ドキュメントには、上記が機能するためには、最後の引数がラムダ式である必要があり、一致する型の変数ではないことが明確に記載されています。