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.
Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом 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, даже если исходный целевой дескриптор метода был.
Части этой страницы — это изменения на основе работы, созданной и общей проектом с открытым исходным кодом Android и используемой в соответствии с условиями, описанными в лицензии Creative Commons 2.5 Attribution.