Поделиться через


MethodHandles.FoldArguments Метод

Определение

Перегрузки

FoldArguments(MethodHandle, Int32, MethodHandle)

Адаптирует дескриптор целевого метода путем предварительной обработки некоторых его аргументов, начиная с заданной позиции, а затем вызывая целевой объект с результатом предварительной обработки, вставленным в исходную последовательность аргументов непосредственно перед сложенными аргументами.

FoldArguments(MethodHandle, MethodHandle)

Адаптирует дескриптор целевого метода путем предварительной обработки некоторых его аргументов, а затем вызывает целевой объект с результатом предварительной обработки, вставленным в исходную последовательность аргументов.

FoldArguments(MethodHandle, Int32, MethodHandle)

Адаптирует дескриптор целевого метода путем предварительной обработки некоторых его аргументов, начиная с заданной позиции, а затем вызывая целевой объект с результатом предварительной обработки, вставленным в исходную последовательность аргументов непосредственно перед сложенными аргументами.

[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments (Java.Lang.Invoke.MethodHandle? target, int pos, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * int * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

Параметры

target
MethodHandle

Дескриптор метода для вызова после объединения аргументов

pos
Int32

положение, с которого начинается свертывание и с которого вставляется результат свертывания; Если это 0так, эффект такой же, как и для #foldArguments(MethodHandle, MethodHandle).

combiner
MethodHandle

Дескриптор метода для первоначального вызова входящих аргументов

Возвращаемое значение

Дескриптор метода, который включает указанную логику свертывания аргументов

Атрибуты

Комментарии

Адаптирует дескриптор целевого метода путем предварительной обработки некоторых его аргументов, начиная с заданной позиции, а затем вызывая целевой объект с результатом предварительной обработки, вставленным в исходную последовательность аргументов непосредственно перед сложенными аргументами.

Этот метод тесно связан с #foldArguments(MethodHandle, MethodHandle), но позволяет управлять положением в списке параметров, в котором происходит свертывание. Аргумент, контролируемый этим, pos— это отсчитываемый от нуля индекс. Указанный выше метод #foldArguments(MethodHandle, MethodHandle) предполагает позицию 0.

Добавлено в 9.

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

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

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

FoldArguments(MethodHandle, MethodHandle)

Адаптирует дескриптор целевого метода путем предварительной обработки некоторых его аргументов, а затем вызывает целевой объект с результатом предварительной обработки, вставленным в исходную последовательность аргументов.

[Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)]
public static Java.Lang.Invoke.MethodHandle? FoldArguments (Java.Lang.Invoke.MethodHandle? target, Java.Lang.Invoke.MethodHandle? combiner);
[<Android.Runtime.Register("foldArguments", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=26)>]
static member FoldArguments : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle

Параметры

target
MethodHandle

Дескриптор метода для вызова после объединения аргументов

combiner
MethodHandle

Дескриптор метода для первоначального вызова входящих аргументов

Возвращаемое значение

Дескриптор метода, который включает указанную логику свертывания аргументов

Атрибуты

Комментарии

Адаптирует дескриптор целевого метода путем предварительной обработки некоторых его аргументов, а затем вызывает целевой объект с результатом предварительной обработки, вставленным в исходную последовательность аргументов.

Предварительная обработка выполняется с помощью combinerвторого дескриптора метода. Из аргументов, переданных адаптеру, первые N аргументы копируются в комбинатор, который затем вызывается. (Здесь N определяется как число параметров объединения.) После этого элемент управления передается целевому объекту с любым результатом из комбинатора, вставленного до исходных N входящих аргументов.

Если комбинатор возвращает значение, первый тип параметра целевого объекта должен совпадать с возвращаемым типом объединения, а следующие N типы параметров целевого объекта должны точно соответствовать параметрам объединения.

Если в комбинаторе возвращается пустота, результат не будет вставлен, а первые N типы параметров целевого объекта должны точно соответствовать параметрам комбинатора.

Результирующий адаптер совпадает с типом целевого объекта, за исключением того, что первый тип параметра удаляется, если он соответствует результату объединения.

(Обратите внимание, что можно использовать для удаления любых аргументов, #dropArguments(MethodHandle,int,List) dropArguments которые не требуется получать либо комбинатор, либо целевой объект. Если некоторые входящие аргументы предназначены только для объединения, рассмотрите возможность использования MethodHandle#asCollector asCollector вместо этого, так как эти аргументы не должны находиться в стеке на входе в целевой объект.)

<b>Example:</b><blockquote>

{@code
            import static java.lang.invoke.MethodHandles.*;
            import static java.lang.invoke.MethodType.*;
            ...
            MethodHandle trace = publicLookup().findVirtual(java.io.PrintStream.class,
              "println", methodType(void.class, String.class))
                .bindTo(System.out);
            MethodHandle cat = lookup().findVirtual(String.class,
              "concat", methodType(String.class, String.class));
            assertEquals("boojum", (String) cat.invokeExact("boo", "jum"));
            MethodHandle catTrace = foldArguments(cat, trace);
            // also prints "boo":
            assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
            }

</blockquote>

Ниже приведен псевдокод для результирующего адаптера. В коде T представляет тип результата адаптера target и результирующего адаптера. V/v представляет тип и значение параметра и аргумента target , предшествовающего свертке позиции; V также является типом combinerрезультата объекта. A/a укажите типы и значения N параметров и аргументов в позиции свертывания. B/b представляют типы и значения target параметров и аргументов, которые соответствуют сложенным параметрам и аргументам. <blockquote>

{@code
            // there are N arguments in A...
            T target(V, A[N]..., B...);
            V combiner(A...);
            T adapter(A... a, B... b) {
              V v = combiner(a...);
              return target(v, a..., b...);
            }
            // and if the combiner has a void return:
            T target2(A[N]..., B...);
            void combiner2(A...);
            T adapter2(A... a, B... b) {
              combiner2(a...);
              return target2(a..., b...);
            }
            }

</blockquote>

<em Примечание.</em>> Результирующий адаптер никогда не является дескриптором метода MethodHandle#asVarargsCollector переменной arity, даже если исходный целевой дескриптор метода был.

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

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

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