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 также должно быть меньше или равно аристи целевого объекта.
<b>Example:</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 метода фильтра использует один аргумент и создает результат, не допускающий пустоту, то collectArguments(mh, N, coll) эквивалентен filterArguments(mh, N, coll). Другие эквиваленты возможны, но потребует перемежания аргументов.
Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".