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.

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

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

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