MethodHandle.AsCollector Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
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 для java.lang.invoke.MethodHandle.asCollector(java.lang.Class<?>, int)
.
Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.
Применяется к
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>, который принимает заданное количество позиционных аргументов, начиная с заданной позиции, и собирает их в аргумент массива. Новый дескриптор метода адаптируется в качестве целевого объекта, текущий дескриптор метода. Тип адаптера будет совпадать с типом целевого объекта, за исключением того, что параметр в позиции, указанной collectArgPos
(обычно arrayType
типом), заменяется arrayLength
параметрами, типом которых является тип arrayType
элемента.
Этот метод ведет себя очень так #asCollector(Class, int)
же, как, но отличается в том, что его collectArgPos
аргумент указывает, в какой позиции должны собираться аргументы списка параметров. Этот индекс основан на нулях.
Добавлено в 9.
Документация по Java для java.lang.invoke.MethodHandle.asCollector(int, java.lang.Class<?>, int)
.
Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.