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