MethodHandles.CollectArguments(MethodHandle, Int32, MethodHandle) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
フィルター (別のメソッド ハンドル) を使用してその引数のサブシーケンスを前処理することによって、ターゲット メソッド ハンドルを調整します。
[Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? CollectArguments (Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? filter);
[<Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member CollectArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
パラメーター
- target
- MethodHandle
引数のサブシーケンスをフィルター処理した後に呼び出すメソッド ハンドル
- pos
- Int32
フィルターに渡す最初のアダプター引数の位置、またはフィルターの結果を受け取るターゲット引数の位置
- filter
- MethodHandle
引数のサブシーケンスで を呼び出すメソッド ハンドル
戻り値
指定した引数サブシーケンス フィルター ロジックを組み込むメソッド ハンドル
- 属性
注釈
フィルター (別のメソッド ハンドル) を使用してその引数のサブシーケンスを前処理することによって、ターゲット メソッド ハンドルを調整します。 前処理された引数は、フィルター関数の結果 (存在する場合) に置き換えられます。 その後、変更された (通常は短縮された) 引数リストでターゲットが呼び出されます。
フィルターが値を返す場合、ターゲットは、その値を位置 pos
、前、またはフィルターに渡されない引数の後に引数として受け入れる必要があります。 フィルターが void を返す場合、ターゲットはフィルターに渡されないすべての引数を受け入れる必要があります。 引数は並べ替えられず、フィルターから返された結果は、最初にアダプターに渡された引数のサブシーケンス全体を (順番に) 置き換えます。
フィルターの引数型 (存在する場合) は、結果として調整されたメソッド ハンドルの位置 pos
にあるターゲットの 0 個または 1 つの引数型を置き換えます。 フィルターの戻り値の型 (存在する場合) は、 の位置 pos
にあるターゲットの引数型と同じである必要があり、そのターゲット引数はフィルターの戻り値によって提供されます。
いずれの場合も、 pos
は 0 以上である必要があります pos
。また、ターゲットのアリティ以下である必要もあります。
<b>例:</b><ブロッククォート>
{@code
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
...
MethodHandle deepToString = publicLookup()
.findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));
MethodHandle ts1 = deepToString.asCollector(String[].class, 1);
assertEquals("[strange]", (String) ts1.invokeExact("strange"));
MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
assertEquals("[up, down]", (String) ts2.invokeExact("up", "down"));
MethodHandle ts3 = deepToString.asCollector(String[].class, 3);
MethodHandle ts3_ts2 = collectArguments(ts3, 1, ts2);
assertEquals("[top, [up, down], strange]",
(String) ts3_ts2.invokeExact("top", "up", "down", "strange"));
MethodHandle ts3_ts2_ts1 = collectArguments(ts3_ts2, 3, ts1);
assertEquals("[top, [up, down], [strange]]",
(String) ts3_ts2_ts1.invokeExact("top", "up", "down", "strange"));
MethodHandle ts3_ts2_ts3 = collectArguments(ts3_ts2, 1, ts3);
assertEquals("[top, [[up, down, strange], charm], bottom]",
(String) ts3_ts2_ts3.invokeExact("top", "up", "down", "strange", "charm", "bottom"));
}
</blockquote>
結果のアダプターの擬似コードを次に示します。 <blockquote>
{@code
T target(A...,V,C...);
V filter(B...);
T adapter(A... a,B... b,C... c) {
V v = filter(b...);
return target(a...,v,c...);
}
// and if the filter has no arguments:
T target2(A...,V,C...);
V filter2();
T adapter2(A... a,C... c) {
V v = filter2();
return target2(a...,v,c...);
}
// and if the filter has a void return:
T target3(A...,C...);
void filter3(B...);
void adapter3(A... a,B... b,C... c) {
filter3(b...);
return target3(a...,c...);
}
}
</blockquote>
コレクション アダプター collectArguments(mh, 0, coll)
は、最初に影響を受ける引数を "フォールド" し、それらを破棄 <するアダプターと同じです。ブロッククォート>
{@code
mh = MethodHandles.dropArguments(mh, 1, coll.type().parameterList()); //step 2
mh = MethodHandles.foldArguments(mh, coll); //step 1
}
</blockquote> ターゲット メソッド ハンドルがフィルターcoll
collectArguments(mh, 0, coll)
の結果 (存在する場合) 以外の引数を使用しない場合、 は とfilterReturnValue(coll, mh)
同じです。 フィルター メソッド ハンドル coll
が 1 つの引数を使用し、void 以外の結果を生成する場合、 collectArguments(mh, N, coll)
は と filterArguments(mh, N, coll)
等価です。 他の等価性も可能ですが、引数の順列が必要になります。
このページの一部は、によって作成および共有された作業に基づく変更であり、に記載されている条件に従って使用されます。