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). Другие эквивалентности возможны, но для этого потребуется перестановка аргументов.

Документация по Java для java.lang.invoke.MethodHandles.collectArguments(java.lang.invoke.MethodHandle, int, java.lang.invoke.MethodHandle).

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.

Применяется к