Язык

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

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

Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".

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