MethodHandle.AsCollector 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
重载
AsCollector(Class, Int32) |
<使 em>数组收集</em> 方法句柄接受给定数量的尾随位置参数,并将其收集到数组参数中。 |
AsCollector(Int32, Class, Int32) |
<使 em>数组收集</em> 方法句柄接受从给定位置开始的给定数量的位置参数,并将其收集到数组参数中。 |
AsCollector(Class, Int32)
<使 em>数组收集</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>数组收集</em> 方法句柄接受给定数量的尾随位置参数,并将其收集到数组参数中。 新方法句柄根据其 目标调整当前方法句柄。 适配器的类型将与目标类型相同,只是单个尾随参数(通常为类型 arrayType
)被 arrayLength
类型为元素类型的 arrayType
参数替换。
如果数组类型与原始目标上的最终参数类型不同,则原始目标将改编为直接采用数组类型,就像通过调用一 #asType asType
样。
调用时,适配器将它的尾随 arrayLength
参数替换为一个类型的 arrayType
新数组,其元素由替换的参数组成(顺序) 。 最后调用目标。 目标最终返回的内容由适配器保持不变。
(如果为零,则数组也可能是共享常量 arrayLength
。
(<em>注意:</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>数组收集</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>数组收集</em> 方法句柄接受从给定位置开始的给定数量的位置参数,并将其收集到数组参数中。 新方法句柄根据其 目标调整当前方法句柄。 适配器的类型将与目标类型相同,不同之处在于(通常为类型)所指示collectArgPos
位置的参数被类型为元素类型的arrayType
参数替换arrayLength
。arrayType
此方法的行为非常类似 #asCollector(Class, int)
,但不同之处在于其 collectArgPos
参数指示应收集参数列表参数中的位置。 此索引从零开始。
已在 9 中添加。
适用于 . 的 java.lang.invoke.MethodHandle.asCollector(int, java.lang.Class<?>, int)
Java 文档
本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。