web-dev-qa-db-ja.com

mapTo呼び出しの有効な構文のパラメーターの後にラムダ式をどのように配置しますか?

わからないコードを見つけました。

JSONArrayListに変換しています。
Kotlinは、関数mapTostdliblink )で提供します

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
17
Altoyyr

ドキュメント で述べられているように:

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 }

ラムダがその呼び出しの唯一の引数である場合、呼び出しの括弧は完全に省略できることに注意してください。

ドキュメントには、上記が機能するためには、最後の引数がラムダ式である必要があり、一致する型の変数ではないことが明確に記載されています。

23
miensol