MethodHandles.FoldArguments 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
多載
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 中新增。
此頁面的部分是根據 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
表示和產生的配接器的結果類型 target
。 V
/v
表示在折疊位置之前之 參數和自變數 target
的類型和值, V
也是的結果型別 combiner
。 A
/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 方法句柄,即使原始目標方法句柄是一樣。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。