共用方式為


MethodHandles.FoldArguments 方法

定義

多載

FoldArguments(MethodHandle, Int32, MethodHandle)

藉由預先處理部分自變數、從指定位置開始,然後使用前置處理的結果呼叫目標,並插入至折疊自變數之前的原始自變數序列,來調整目標方法句柄。

FoldArguments(MethodHandle, MethodHandle)

藉由預先處理某些自變數來調整目標方法句柄,然後使用前置處理的結果呼叫目標,並插入原始自變數序列中。

FoldArguments(MethodHandle, Int32, MethodHandle)

藉由預先處理部分自變數、從指定位置開始,然後使用前置處理的結果呼叫目標,並插入至折疊自變數之前的原始自變數序列,來調整目標方法句柄。

[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments (Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

參數

target
MethodHandle

在自變數合併之後叫用的方法句柄

pos
Int32

要開始折疊的位置,以及要插入折疊結果的位置;如果這是 0,效果會與 相同 #foldArguments(MethodHandle, MethodHandle)

combiner
MethodHandle

方法句柄,以一開始在傳入自變數上呼叫

傳回

方法句柄,其中包含指定的自變數折疊邏輯

屬性

備註

藉由預先處理部分自變數、從指定位置開始,然後使用前置處理的結果呼叫目標,並插入至折疊自變數之前的原始自變數序列,來調整目標方法句柄。

這個方法與密切相關 #foldArguments(MethodHandle, MethodHandle),但允許控制參數清單中發生折疊的位置。 控制這個 的 pos自變數是以零起始的索引。 上述方法 #foldArguments(MethodHandle, MethodHandle) 假設位置 0。

已在 9 中新增。

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

此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。

適用於

FoldArguments(MethodHandle, MethodHandle)

藉由預先處理某些自變數來調整目標方法句柄,然後使用前置處理的結果呼叫目標,並插入原始自變數序列中。

[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments (Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

參數

target
MethodHandle

在自變數合併之後叫用的方法句柄

combiner
MethodHandle

方法句柄,以一開始在傳入自變數上呼叫

傳回

方法句柄,其中包含指定的自變數折疊邏輯

屬性

備註

藉由預先處理某些自變數來調整目標方法句柄,然後使用前置處理的結果呼叫目標,並插入原始自變數序列中。

前置處理是由 combiner執行,這是第二個方法句柄。 在傳遞至配接器的自變數中,第一個 N 自變數會複製到合併器,然後呼叫它。 (這裡, N 定義為結合器的參數計數。在此之後,控件會傳遞至目標,並在原始 N 傳入自變數之前插入合併器的任何結果。

如果結合器傳回值,則目標的第一個參數類型必須與結合子的傳回型別相同,而目標的下一個 N 參數類型必須完全符合結合器的參數。

如果結合器傳回 void,則不會插入任何結果,而且目標的第一個 N 參數類型必須完全符合結合器的參數。

產生的配接器與目標類型相同,不同之處在於,如果第一個參數類型對應至結合器的結果,則會卸除。

(請注意, #dropArguments(MethodHandle,int,List) dropArguments 可用來移除結合器或目標不想要接收的任何自變數。如果某些傳入自變數只針對結合器,請考慮改 MethodHandle#asCollector asCollector 用 ,因為這些自變數不需要在目標專案的堆疊上即時。

<b>範例:</b><blockquote>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodHandle trace = publicLookup().findVirtual(java.io.PrintStream.class,
              "println", methodType(void.class, String.class))
                .bindTo(System.out);
            MethodHandle cat = lookup().findVirtual(String.class,
              "concat", methodType(String.class, String.class));
            assertEquals("boojum", (String) cat.invokeExact("boo", "jum"));
            MethodHandle catTrace = foldArguments(cat, trace);
            // also prints "boo":
            assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
            }

</blockquote>

以下是產生的配接器的虛擬程序代碼。 在程式代碼中, T 表示和產生的配接器的結果類型 targetV/v 表示在折疊位置之前之 參數和自變數 target 的類型和值, V 也是的結果型別 combinerA/a 表示折疊位置之參數和自變數的類型 N 和值。 B/b 代表遵循折疊參數和自變數的參數 target 和自變數的類型和值。 <blockquote>

{@code
            // there are N arguments in A...
            T target(V, A[N]..., B...);
            V combiner(A...);
            T adapter(A... a, B... b) {
              V v = combiner(a...);
              return target(v, a..., b...);
            }
            // and if the combiner has a void return:
            T target2(A[N]..., B...);
            void combiner2(A...);
            T adapter2(A... a, B... b) {
              combiner2(a...);
              return target2(a..., b...);
            }
            }

</blockquote>

<em>Note:</em> 產生的配接器絕不是 MethodHandle#asVarargsCollector variable-arity 方法句柄,即使原始目標方法句柄是一樣。

java.lang.invoke.MethodHandles.foldArguments(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)Java 檔。

此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。

適用於