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

フィルターの引数型 (存在する場合) は、結果として調整されたメソッド ハンドルの位置 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> ターゲット メソッド ハンドルがフィルターcollcollectArguments(mh, 0, coll)の結果 (存在する場合) 以外の引数を使用しない場合、 は とfilterReturnValue(coll, mh)同じです。 フィルター メソッド ハンドル coll が 1 つの引数を使用し、void 以外の結果を生成する場合、 collectArguments(mh, N, coll) は と filterArguments(mh, N, coll)等価です。 他の等価性も可能ですが、引数の順列が必要になります。

java.lang.invoke.MethodHandles.collectArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle)Java ドキュメント。

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

適用対象