Язык

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. Он управляет параметрами цикла и типом результатов в стандартном регистре (см. выше подробные сведения). Он должен принимать собственный тип возвращаемого значения (если непустый) плюс T параметр (для итерированных значений) и может принимать любое количество дополнительных типов. См. выше сведения о других ограничениях.

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

Дескриптор метода, который олицетворяет функциональные возможности цикла итерации.

Атрибуты

Комментарии

Создает цикл, диапазоны по значениям, создаваемым объектом Iterator<T>. Это удобная оболочка для универсального комбинатора циклов #loop(MethodHandle[][]).

Сам итератор определяется оценкой дескриптора iterator . Каждое создаваемое значение будет храниться в переменной итерации цикла типа T.

body Если дескриптор возвращаетvoid типV, то также присутствует ведущая переменная итерации цикла этого типа. Эта переменная инициализирована с помощью необязательного init дескриптора или значения #empty по умолчанию по умолчанию типа V , если этот дескриптор имеет значение null.

В каждой итерации переменные итерации передаются вызову дескриптора body . void Значение, возвращаемое телом (типаV), обновляет переменную итерации. Результат выполнения дескриптора цикла будет окончательным V значением этой переменной (или void если V нет переменной).

Следующие правила, удерживаемые для дескрипторов аргументов:ul>li, дескриптор не должен быть; его тип должен быть nullформы(V T A...)V, где V неvoid является или иным (T A...)voidобразом.body><< (В void данном случае мы назначим тип имениV, и мы будем писать (V T A...)V с пониманием того, что void тип Vvoid тихо удаляется из списка параметров, оставляя (T A...)V.) <li>Список параметров (V T A...) текста вносит свой вклад в список типов, называемых списком <>внутренних параметров< em/em>. Он будет ограничивать списки параметров других частей цикла. <li>Как особый случай, если текст вносит только V и T типы, без дополнительных A типов, внутренний список параметров расширяется типами A...iterator аргументов дескриптора; если он null является одним типом Iterable и представляет собой A... список. <li>Если типы (V T) переменных итерации удаляются из внутреннего списка параметров, результирующий короткий список (A...) называется списком <>внешних параметров< или em>. <li>Тип возвращаемого текста V, если он неvoid является, определяет тип дополнительной переменной состояния цикла. Текст должен принимать ведущий параметр и возвращать значение этого типа V. <li>, если init он не являетсяnull, он должен иметь тип возвращаемого значения V. Его список параметров (некоторых форм <c>(A*)</c>) должен быть фактически идентичным внешнему списку (A...)параметров. <li>If init , nullпеременная цикла будет инициализирована в его #empty значение по умолчанию. <li>, если дескриптор iterator не являетсяnull, он должен иметь тип java.util.Iterator возвращаемого значения или подтип. Итератор, который он создает при выполнении цикла, предполагается, что возвращает значения, которые можно преобразовать в тип T. <li>Список параметров, iterator не относящихсяnull к определенной форме (A*), должен быть фактически идентичным внешнему списку (A...)параметров. <li>, если nulliterator по умолчанию используется дескриптор метода, который ведет себя какjava.lang.Iterable#iterator(). В этом случае внутренний список (V T A...) параметров должен иметь по крайней мере один A тип, а параметр дескриптора по умолчанию настраивается для принятия ведущего A типа, как если бы MethodHandle#asType asType метод преобразования. Ведущий A тип должен быть Iterable или подтипом его. Этот шаг преобразования, выполненный во время построения цикла, не должен вызывать WrongMethodTypeExceptionисключение. </ul>

Тип T может быть примитивом или ссылкой. Так как тип Iterator<T> удаляется в представлении дескриптора метода в необработанный тип Iterator, iteratedLoop комбинатор настраивает ведущий тип аргумента так bodyObject , как если 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.

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

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

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