語言

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

方法的 handle 在篩選參數子序列後

pos
Int32

第一個要傳遞給濾波器的適配器參數的位置,和/或接收濾波器結果的目標引數

filter
MethodHandle

方法的 handle 以呼叫參數子序列

傳回

方法代柄,包含指定的參數子序列過濾邏輯

屬性

備註

透過預先處理其參數子序列,並使用濾波器(另一個方法的代柄)來調整目標方法的句柄。 預處理的參數會被濾波器函式的結果(如有)取代。 接著,目標會在修改過的(通常縮短的)參數列表中被呼叫。

若濾波器回傳一個值,目標必須接受該值作為其位置 pos參數,且前置及/或後面是未傳入濾波器的參數。 若濾波器回傳 void,目標必須接受所有未傳入濾波器的參數。 不會重新排序參數,且從濾波器回傳的結果會依序替換原本傳遞給介面卡的整個參數子序列。

濾波器的參數類型(若有)會替換目標在位置 的零或一個參數類型 pos,並置於結果的自適應方法代柄中。 濾波器的回傳類型(如有)必須與位置 pos目標的參數類型相同,而該目標參數由濾波器的回傳值提供。

在所有情況下,必須 pos 大於或等於零,且 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>

{@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...);
            }
            }

</區塊引用>

集合介面 collectArguments(mh, 0, coll) 器等同於先「摺疊」受影響參數,然後分步驟丟棄,步驟如下: <blockquote>

{@code
            mh = MethodHandles.dropArguments(mh, 1, coll.type().parameterList()); //step 2
            mh = MethodHandles.foldArguments(mh, coll); //step 1
            }

</blockquote> 如果目標方法的handle只消耗濾波器 coll結果(若有的話)的參數,則 collectArguments(mh, 0, coll) 等價 filterReturnValue(coll, mh)於。 若濾波器方法的處理 coll 佔用一個參數並產生非空值結果,則 collectArguments(mh, N, coll) 等價於 filterArguments(mh, N, coll)。 其他等價也可行,但需要參數置換。

的 java.lang.invoke.MethodHandles.collectArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle)Java 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於