MethodHandle.AsCollector 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
多載
AsCollector(Class, Int32) |
<讓 em>array-collect</em> 方法句柄接受指定數目的尾端位置自變數,並將其收集到陣列自變數中。 |
AsCollector(Int32, Class, Int32) |
<讓 em>array-collect</em> 方法句柄接受從指定位置開始的指定位置自變數數目,並將其收集到陣列自變數中。 |
AsCollector(Class, Int32)
<讓 em>array-collect</em> 方法句柄接受指定數目的尾端位置自變數,並將其收集到陣列自變數中。
[Android.Runtime.Register("asCollector", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_Ljava_lang_Class_IHandler", ApiSince=26)]
public virtual Java.Lang.Invoke.MethodHandle? AsCollector(Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asCollector", "(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_Ljava_lang_Class_IHandler", ApiSince=26)>]
abstract member AsCollector : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsCollector : Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
參數
- arrayType
- Class
數位自變數的類型通常會 Object[]
收集自變數
- arrayLength
- Int32
要收集到新陣列自變數的自變數數目
傳回
新的方法句柄,它會先將一些尾端自變數收集到陣列中,再呼叫原始方法句柄
- 屬性
備註
<讓 em>array-collect</em> 方法句柄接受指定數目的尾端位置自變數,並將其收集到陣列自變數中。 新的方法句柄會隨著其 目標調整目前的方法句柄。 配接器的型別會與目標的類型相同,不同之處在於單一尾端參數(通常 arrayType
為 類型)會由 arrayLength
類型為 元素類型的 arrayType
參數所取代。
如果陣列類型與原始目標上的最終自變數類型不同,則原始目標會改編成直接採用數位型態,如同透過呼叫 #asType asType
。
呼叫時,配接器會將其尾端 arrayLength
自變數取代為類型的 arrayType
單一新陣列,其元素會組成已取代的自變數(依順序排列)。 最後會呼叫目標。 目標最終傳回的內容會由配接器傳回不變。
(當 為零時 arrayLength
,陣列也可能是共用常數。
(<em>Note:</em> 通常 arrayType
與原始目標的最後一個參數類型相同。它是與 asSpreader
對稱的明確自變數,也允許目標使用簡單 Object
作為其最後一個參數類型。
若要建立不限於特定集合自變數數目的收集配接器,請改用 #asVarargsCollector asVarargsCollector
。
以下是陣列收集方法句柄的一些範例: <blockquote>
{@code
MethodHandle deepToString = publicLookup()
.findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));
assertEquals("[won]", (String) deepToString.invokeExact(new Object[]{"won"}));
MethodHandle ts1 = deepToString.asCollector(Object[].class, 1);
assertEquals(methodType(String.class, Object.class), ts1.type());
//assertEquals("[won]", (String) ts1.invokeExact( new Object[]{"won"})); //FAIL
assertEquals("[[won]]", (String) ts1.invokeExact((Object) new Object[]{"won"}));
// arrayType can be a subtype of Object[]
MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
assertEquals(methodType(String.class, String.class, String.class), ts2.type());
assertEquals("[two, too]", (String) ts2.invokeExact("two", "too"));
MethodHandle ts0 = deepToString.asCollector(Object[].class, 0);
assertEquals("[]", (String) ts0.invokeExact());
// collectors can be nested, Lisp-style
MethodHandle ts22 = deepToString.asCollector(Object[].class, 3).asCollector(String[].class, 2);
assertEquals("[A, B, [C, D]]", ((String) ts22.invokeExact((Object)'A', (Object)"B", "C", "D")));
// arrayType can be any primitive array type
MethodHandle bytesToString = publicLookup()
.findStatic(Arrays.class, "toString", methodType(String.class, byte[].class))
.asCollector(byte[].class, 3);
assertEquals("[1, 2, 3]", (String) bytesToString.invokeExact((byte)1, (byte)2, (byte)3));
MethodHandle longsToString = publicLookup()
.findStatic(Arrays.class, "toString", methodType(String.class, long[].class))
.asCollector(long[].class, 1);
assertEquals("[123]", (String) longsToString.invokeExact((long)123));
}
</blockquote>
的 java.lang.invoke.MethodHandle.asCollector(java.lang.Class<?>, int)
Java 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
適用於
AsCollector(Int32, Class, Int32)
<讓 em>array-collect</em> 方法句柄接受從指定位置開始的指定位置自變數數目,並將其收集到陣列自變數中。
[Android.Runtime.Register("asCollector", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_ILjava_lang_Class_IHandler", ApiSince=33)]
public virtual Java.Lang.Invoke.MethodHandle? AsCollector(int collectArgPos, Java.Lang.Class? arrayType, int arrayLength);
[<Android.Runtime.Register("asCollector", "(ILjava/lang/Class;I)Ljava/lang/invoke/MethodHandle;", "GetAsCollector_ILjava_lang_Class_IHandler", ApiSince=33)>]
abstract member AsCollector : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
override this.AsCollector : int * Java.Lang.Class * int -> Java.Lang.Invoke.MethodHandle
參數
- collectArgPos
- Int32
要開始收集的參數清單中以零起始的位置。
- arrayType
- Class
數位自變數的類型通常會 Object[]
收集自變數
- arrayLength
- Int32
要收集到新陣列自變數的自變數數目
傳回
新的方法句柄,會在呼叫原始方法句柄之前,先將一些自變數收集到陣列中
- 屬性
備註
<讓 em>array-collect</em> 方法句柄接受從指定位置開始的指定位置自變數數目,並將其收集到陣列自變數中。 新的方法句柄會隨著其 目標調整目前的方法句柄。 配接器的類型會與目標的類型相同,不同之處在於位於 (通常是 類型arrayType
) 所指示collectArgPos
位置的參數會取代arrayLength
類型為 的元素類型arrayType
。
這個方法的行為非常類似 #asCollector(Class, int)
,但其 collectArgPos
自變數會指出應該收集參數清單自變數中的位置。 此索引是以零起始。
已在 9 中新增。
的 java.lang.invoke.MethodHandle.asCollector(int, java.lang.Class<?>, int)
Java 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。