MethodHandles.IteratedLoop(MethodHandle, MethodHandle, MethodHandle) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Создает цикл, который выполняет диапазон значений, созданных .Iterator<T>
[Android.Runtime.Register("iteratedLoop", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)]
public static Java.Lang.Invoke.MethodHandle? IteratedLoop (Java.Lang.Invoke.MethodHandle? iterator, Java.Lang.Invoke.MethodHandle? init, Java.Lang.Invoke.MethodHandle? body);
[<Android.Runtime.Register("iteratedLoop", "(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;", "", ApiSince=33)>]
static member IteratedLoop : Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle * Java.Lang.Invoke.MethodHandle -> Java.Lang.Invoke.MethodHandle
Параметры
- iterator
- MethodHandle
необязательный дескриптор для возврата итератора для запуска цикла.
Если значение не являетсяnull
, дескриптор должен возвращать java.util.Iterator
или подтип .
Другие ограничения см. выше.
- init
- MethodHandle
необязательный инициализатор, предоставляющий начальное значение переменной цикла.
Может иметь значение null
, подразумевающее начальное значение по умолчанию. Другие ограничения см. выше.
- body
- MethodHandle
текст цикла, который может не иметь значение null
.
Он управляет параметрами цикла и типом результата в стандартном регистре (дополнительные сведения см. выше).
Он должен принимать собственный тип возвращаемого значения (если не является void) плюс T
параметр (для итерированных значений) и может принимать любое количество дополнительных типов.
Другие ограничения см. выше.
Возвращаемое значение
дескриптор метода, воплощающий функциональные возможности цикла итерации.
- Атрибуты
Комментарии
Создает цикл, который выполняет диапазон значений, созданных .Iterator<T>
Это удобная оболочка для универсального комбинатора цикла #loop(MethodHandle[][]).
Сам итератор будет определяться вычислением iterator
дескриптора. Каждое создаваемое значение будет храниться в переменной итерации цикла типа T
.
Если дескриптор body
возвращает тип, отличныйvoid
от типа V
, также присутствует переменная итерации в начале цикла этого типа. Эта переменная инициализируется с помощью необязательного init
дескриптора или для #empty значения по умолчанию типа V
, если этот дескриптор имеет значение null
.
В каждой итерации переменные итерации передаются в вызов дескриптора body
. Значение,void
отличное от текста (типа V
), обновляет переменную итерации в начале. Результатом выполнения дескриптора цикла будет конечное V
значение этой переменной (или void
, если переменная отсутствует V
).
Следующие правила удерживают аргумент handles:ul>li. Дескриптор body
не должен иметь null
значение ; его тип должен иметь вид (V T A...)V
, где V
имеет значение не-void
или иначе (T A...)void
.><< (В этом void
случае мы назначим тип void
имени V
и напишем (V T A...)V
с пониманием того, что void
тип V
незаметно удаляется из списка параметров, оставляя (T A...)V
.) <li>Список параметров текста содержит список типов, называемых внутренним списком<< параметров em>/em>.(V T A...)
Он ограничивает списки параметров других частей цикла. <Li>В особом случае, если текст содержит только V
типы и T
без дополнительных A
типов, то внутренний список параметров расширяется на типы A...
аргументов дескриптора iterator
; если это null
один тип Iterable
добавляется и составляет A...
список. <Li>Если типы (V T)
переменных итерации удаляются из внутреннего списка параметров, результирующий более короткий список (A...)
называется <em>external parameter list</em>. <Li>Тип возвращаемого V
текста , если не являетсяvoid
, определяет тип дополнительной переменной состояния цикла. Текст должен принимать ведущий параметр и возвращать значение этого типа V
. <Если>init
параметр не является ,null
он должен иметь тип возвращаемого значения V
. Его список параметров (формы <c>(A*)</c>) должен быть фактически идентичен списку (A...)
внешних параметров . <Li>Если init
имеет значение null
, переменная цикла будет инициализирована #empty значением по умолчанию. <Li>Если дескриптор iterator
не является ,null
он должен иметь тип java.util.Iterator
возвращаемого значения или его подтип. Предполагается, что итератор, который он создает при выполнении цикла, возвращает значения, которые можно преобразовать в тип T
. <Li>Список iterator
параметров объекта , который не являетсяnull
( в той или иной форме (A*)
), должен быть фактически идентичен списку (A...)
внешних параметров . <Li>, если iterator
по null
умолчанию используется дескриптор метода, который ведет себя так же, как java.lang.Iterable#iterator()
. В этом случае внутренний список (V T A...)
параметров должен иметь по крайней мере один A
тип, а параметр дескриптора по умолчанию настраивается таким образом, чтобы он принимал ведущий A
тип, как если бы метод преобразования MethodHandle#asType asType
. A
Ведущим типом должен быть Iterable
или его подтип. Этот шаг преобразования, выполненный во время создания цикла, не должен вызывать исключение WrongMethodTypeException
. </ul>
Тип T
может быть либо примитивом, либо ссылкой. Так как тип Iterator<T>
удаляется в представлении дескриптора метода к необработанному типу Iterator
, комбинатор iteratedLoop
настраивает тип аргумента для body
на , Object
как будто методом MethodHandle#asType asType
преобразования. Таким образом, если при выполнении цикла отображается итератор неправильного типа, могут возникнуть исключения среды выполнения в результате динамических преобразований, выполняемых .MethodHandle#asType(MethodType)
Результирующий тип результата и сигнатура параметра дескриптора цикла определяются следующим образом:<ul><li>Тип результата дескриптора цикла является типом V
результата текста. <Li>Типы параметров дескриптора цикла — это типы (A...)
из списка внешних параметров. </ul>
Ниже приведен псевдокод для результирующего дескриптора цикла. В коде представляет тип или значение переменной цикла, V
/v
а также тип результата цикла; T
/t
, что элементы структуры, по которым цикл выполняет итерацию, и A...
/a...
представляют аргументы, передаваемые циклу. <blockquote>
{@code
Iterator<T> iterator(A...); // defaults to Iterable::iterator
V init(A...);
V body(V,T,A...);
V iteratedLoop(A... a...) {
Iterator<T> it = iterator(a...);
V v = init(a...);
while (it.hasNext()) {
T t = it.next();
v = body(v, t, a...);
}
return v;
}
}
</blockquote>
Добавлено в 9.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.