Language

MethodHandles.CollectArguments(MethodHandle, Int32, MethodHandle) メソッド

定義

フィルター (別のメソッド ハンドル) を使用してその引数のサブシーケンスを前処理することによって、ターゲット メソッド ハンドルを調整します。

[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 を返す場合、ターゲットはフィルターに渡されないすべての引数を受け入れる必要があります。 引数は並べ替えられず、フィルターから返された結果は、最初にアダプターに渡された引数のサブシーケンス全体を (順番に) 置き換えます。

フィルターの引数型 (存在する場合) は、結果として適用されたメソッド ハンドル内のターゲットの 0 個または 1 つの引数型 pos位置で置き換えられます。 フィルターの戻り値の型 (存在する場合) は、 pos位置にあるターゲットの引数型と同じである必要があり、そのターゲット引数はフィルターの戻り値によって提供されます。

いずれの場合も、 pos は 0 以上である必要があり、 pos もターゲットのアリティ以下である必要があります。

<b>Example:</b><blockquote>

{@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) は、影響を受ける引数を最初に "折りたたむ" ものに相当し、次のように別の手順で削除します。 <blockquote>

{@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)と同じです。 他の等価性も可能ですが、引数の順列が必要です。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

適用対象