MethodHandles.CollectArguments(MethodHandle, Int32, MethodHandle) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Адаптирует дескриптор целевого метода путем предварительной обработки вложенной последовательности его аргументов с помощью фильтра (другого дескриптора метода).
[Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? CollectArguments (Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? filter);
[<Android.Runtime.Register("collectArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member CollectArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
Параметры
- target
- MethodHandle
дескриптор метода, вызываемый после фильтрации вложенной последовательности аргументов
- pos
- Int32
позиция первого аргумента адаптера, передаваемого фильтру, и (или) целевого аргумента, который получает результат фильтра.
- filter
- MethodHandle
дескриптор метода для вызова для вложенной последовательности аргументов
Возвращаемое значение
дескриптор метода, который включает указанную логику фильтрации вложенной последовательности аргументов
- Атрибуты
Комментарии
Адаптирует дескриптор целевого метода путем предварительной обработки вложенной последовательности его аргументов с помощью фильтра (другого дескриптора метода). Предварительно обработанные аргументы заменяются результатом (если таковые имеются) функции фильтра. Затем целевой объект вызывается в измененном (обычно сокращенном) списке аргументов.
Если фильтр возвращает значение, целевой объект должен принять это значение в качестве аргумента в позиции pos
, предшествующей и (или) за которой следуют любые аргументы, не переданные фильтру. Если фильтр возвращает значение void, целевой объект должен принимать все аргументы, не переданные фильтру. Аргументы не переупорядочены, а результат, возвращаемый фильтром, заменяет (по порядку) всю подсеть аргументов, изначально переданных адаптеру.
Типы аргументов (если таковые есть) фильтра заменяют нулевой или один тип аргументов целевого объекта в позиции pos
в результирующем адаптированном дескриптоле метода. Тип возвращаемого значения фильтра (если таковой имеется) должен быть идентичен типу аргумента целевого объекта в позиции pos
, а этот целевой аргумент предоставляется возвращаемым значением фильтра.
Во всех случаях pos
значение должно быть больше или равно нулю, а pos
также должно быть меньше или равно arity целевого объекта.
<b>Пример:</b><blockquote>
{@code
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
...
MethodHandle deepToString = publicLookup()
.findStatic(Arrays.class, "deepToString", methodType(String.class, Object[].class));
MethodHandle ts1 = deepToString.asCollector(String[].class, 1);
assertEquals("[strange]", (String) ts1.invokeExact("strange"));
MethodHandle ts2 = deepToString.asCollector(String[].class, 2);
assertEquals("[up, down]", (String) ts2.invokeExact("up", "down"));
MethodHandle ts3 = deepToString.asCollector(String[].class, 3);
MethodHandle ts3_ts2 = collectArguments(ts3, 1, ts2);
assertEquals("[top, [up, down], strange]",
(String) ts3_ts2.invokeExact("top", "up", "down", "strange"));
MethodHandle ts3_ts2_ts1 = collectArguments(ts3_ts2, 3, ts1);
assertEquals("[top, [up, down], [strange]]",
(String) ts3_ts2_ts1.invokeExact("top", "up", "down", "strange"));
MethodHandle ts3_ts2_ts3 = collectArguments(ts3_ts2, 1, ts3);
assertEquals("[top, [[up, down, strange], charm], bottom]",
(String) ts3_ts2_ts3.invokeExact("top", "up", "down", "strange", "charm", "bottom"));
}
</blockquote>
Ниже приведен псевдокод для результирующего адаптера: <blockquote>
{@code
T target(A...,V,C...);
V filter(B...);
T adapter(A... a,B... b,C... c) {
V v = filter(b...);
return target(a...,v,c...);
}
// and if the filter has no arguments:
T target2(A...,V,C...);
V filter2();
T adapter2(A... a,C... c) {
V v = filter2();
return target2(a...,v,c...);
}
// and if the filter has a void return:
T target3(A...,C...);
void filter3(B...);
void adapter3(A... a,B... b,C... c) {
filter3(b...);
return target3(a...,c...);
}
}
</blockquote>
Адаптер коллекции эквивалентен адаптеру collectArguments(mh, 0, coll)
, который сначала "складывает" затронутые аргументы, а затем удаляет их в отдельных шагах следующим образом: <blockquote>
{@code
mh = MethodHandles.dropArguments(mh, 1, coll.type().parameterList()); //step 2
mh = MethodHandles.foldArguments(mh, coll); //step 1
}
</blockquote> Если дескриптор целевого метода не использует никаких аргументов, кроме результата (при наличии) фильтра coll
, то collectArguments(mh, 0, coll)
эквивалентно filterReturnValue(coll, mh)
. Если дескриптор coll
метода фильтра использует один аргумент и выдает результат, отличный от void, то collectArguments(mh, N, coll)
эквивалентно filterArguments(mh, N, coll)
. Другие эквивалентности возможны, но для этого потребуется перестановка аргументов.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.