MethodHandles.IteratedLoop(MethodHandle, MethodHandle, MethodHandle) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Construye un bucle que abarca los valores generados por .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
Parámetros
- iterator
- MethodHandle
un identificador opcional para devolver el iterador para iniciar el bucle.
Si no es asínull, el identificador debe devolver java.util.Iterator o un subtipo.
Consulte lo anterior para ver otras restricciones.
- init
- MethodHandle
inicializador opcional, proporcionando el valor inicial de la variable de bucle.
Puede ser null, lo que implica un valor inicial predeterminado. Consulte lo anterior para ver otras restricciones.
- body
- MethodHandle
cuerpo del bucle, que puede no ser null.
Controla los parámetros de bucle y el tipo de resultado en el caso estándar (consulte más arriba para obtener más información).
Debe aceptar su propio tipo de valor devuelto (si no es nulo) más un T parámetro (para los valores iterados) y puede aceptar cualquier número de tipos adicionales.
Consulte lo anterior para ver otras restricciones.
Devoluciones
un identificador de método que incorpora la funcionalidad del bucle de iteración.
- Atributos
Comentarios
Construye un bucle que abarca los valores generados por .Iterator<T> Se trata de un contenedor de conveniencia para el combinador de bucle genérico #loop(MethodHandle[][]).
La propia iterador se determinará mediante la evaluación del iterator identificador. Cada valor que genera se almacenará en una variable de iteración de bucle de tipo T.
Si el body identificador devuelve un tipo Vdistintovoid de , también existe una variable de iteración de bucle inicial de ese tipo. Esta variable se inicializa mediante el identificador opcional init o en el #empty valor predeterminado de tipo V si ese identificador es null.
En cada iteración, las variables de iteración se pasan a una invocación del body identificador.
void Un valor no devuelto desde el cuerpo (de tipo V) actualiza la variable de iteración inicial. El resultado de la ejecución del controlador de bucle será el valor final V de esa variable (o void si no hay ninguna V variable).
Las reglas siguientes contienen para el argumento handles:<ul><li>El body identificador no debe ser null; su tipo debe ser del formato (V T A...)V, donde V no esvoid , o de lo contrario (T A...)void. (En el void caso, asignamos el tipo void al nombre Vy escribiremos (V T A...)V con la comprensión de que un void tipo V se quita silenciosamente de la lista de parámetros, dejando (T A...)V). <li>La lista (V T A...) de parámetros del cuerpo contribuye a una lista de tipos denominados <em>internal parameter list</em>. Restringirá las listas de parámetros de las otras partes del bucle.
<li>Como caso especial, si el cuerpo solo contribuye V y T los tipos, sin tipos adicionales A , la lista de parámetros internos se extiende por los tipos A... de argumento del iterator identificador; si es null el tipo Iterable único se agrega y constituye la A... lista.
<li>Si los tipos (V T) de variable de iteración se quitan de la lista de parámetros internos, la lista (A...) más corta resultante se denomina <lista de parámetros<> externos em>.
<li>El tipo Vde valor devuelto body , si no es asívoid, determina el tipo de una variable de estado adicional del bucle. El cuerpo debe aceptar un parámetro inicial y devolver un valor de este tipo V.
<li>Si init no es asínull, debe tener el tipo Vde valor devuelto . Su lista de parámetros (de alguna forma <c>(A*)</c>) debe ser eficazmente idéntica a la lista (A...)de parámetros externos .
<li>Si init es null, la variable de bucle se inicializará en su #empty valor predeterminado.
<li>Si el iterator identificador nonull es, debe tener el tipo java.util.Iterator de valor devuelto o un subtipo allí mismo. Iterador que genera cuando se ejecuta el bucle se supone que produce valores que se pueden convertir al tipo T.
<li>La lista de parámetros de un iterator que nonull es (de alguna forma (A*)) debe ser eficazmente idéntica a la lista (A...)de parámetros externos .
<li>Si iterator es null el valor predeterminado de un identificador de método que se comporta como java.lang.Iterable#iterator(). En ese caso, la lista (V T A...) de parámetros internos debe tener al menos un A tipo y el parámetro de identificador de iterador predeterminado se ajusta para aceptar el tipo inicial A , como si fuera el método de MethodHandle#asType asType conversión. El tipo inicial A debe ser Iterable o un subtipo. Este paso de conversión, realizado en tiempo de construcción del bucle, no debe iniciar un WrongMethodTypeException.
</ul>
El tipo T puede ser un primitivo o una referencia. Dado que el tipo Iterator<T> se borra en la representación del identificador del método en el tipo Iteratorsin formato, el iteratedLoop combinador ajusta el tipo de argumento inicial para bodyObject como si fuera el método de MethodHandle#asType asType conversión. Por lo tanto, si aparece un iterador del tipo incorrecto cuando se ejecuta el bucle, las excepciones en tiempo de ejecución pueden producirse como resultado de conversiones dinámicas realizadas por MethodHandle#asType(MethodType).
El tipo de resultado y la firma de parámetro del controlador de bucle resultante se determinan de la siguiente manera:< ul<>li>El tipo de resultado del controlador de bucle es el tipo V de resultado del cuerpo.
<li>Los tipos de parámetro del controlador de bucle son los tipos (A...), de la lista de parámetros externos.
</ul>
Este es el pseudocódigo para el identificador de bucle resultante. En el código, Vv/representa el tipo /valor de la variable de bucle, así como el tipo de resultado del bucle; ,/Tt el de los elementos de la estructura en la que el bucle recorre en iteración y A.../a... representa los argumentos pasados al bucle.
<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>
Agregado en 9.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el Android y se usan según los términos descritos en creative Creative Commons 2.5 Attribution License.