MethodHandles.IteratedLoop(MethodHandle, MethodHandle, MethodHandle) Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Constrói um loop que varia sobre os valores produzidos por um 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
um identificador opcional para retornar o iterador para iniciar o loop.
Se não fornull, o identificador deverá retornar java.util.Iterator ou um subtipo.
Consulte acima para obter outras restrições.
- init
- MethodHandle
inicializador opcional, fornecendo o valor inicial da variável de loop.
Pode ser null, implicando um valor inicial padrão. Consulte acima para obter outras restrições.
- body
- MethodHandle
corpo do loop, que pode não ser null.
Ele controla os parâmetros de loop e o tipo de resultado no caso padrão (consulte acima para obter detalhes).
Ele deve aceitar seu próprio tipo de retorno (se não nulo) mais um T parâmetro (para os valores iterados) e pode aceitar qualquer número de tipos adicionais.
Consulte acima para obter outras restrições.
Retornos
um identificador de método que incorpora a funcionalidade de loop de iteração.
- Atributos
Comentários
Constrói um loop que varia sobre os valores produzidos por um Iterator<T>. Esse é um wrapper de conveniência para o combinador de loop genérico #loop(MethodHandle[][]).
O próprio iterador será determinado pela avaliação do iterator identificador. Cada valor que ele produz será armazenado em uma variável de iteração de loop do tipo T.
Se o body identificador retornar um tipo Vdiferentevoid, uma variável de iteração de loop à esquerda desse tipo também estará presente. Essa variável é inicializada usando o identificador opcional init ou para o #empty valor padrão do tipo V se esse identificador for null.
Em cada iteração, as variáveis de iteração são passadas para uma invocação do body identificador. Um valor não retornadovoid do corpo (do tipo V) atualiza a variável de iteração principal. O resultado da execução do identificador de loop será o valor final V dessa variável (ou void se não houver nenhuma V variável).
As regras a seguir contêm os identificadores de argumento:ul>li O identificador não deve sernull; seu tipo deve ser do formulário(V T A...)V, onde V não estávoid ou então (T A...)void.body><< (No void caso, atribuimos o tipo void ao nome Ve escreveremos (V T A...)V com a compreensão de que um void tipo V é removido silenciosamente da lista de parâmetros, deixando (T A...)V.) <li>A lista (V T A...) de parâmetros do corpo contribui para uma lista de tipos chamados <em>lista< de parâmetros internos/em>. Ele restringirá as listas de parâmetros das outras partes de loop.
<li>Como um caso especial, se o corpo contribuir apenas V e T tipos, sem tipos adicionais A , a lista de parâmetros interno será estendida pelos tipos A... de argumento do iterator identificador; se for null o tipo Iterable único for adicionado e constituir a A... lista.
<li>Se os tipos (V T) de variável de iteração forem removidos da lista de parâmetros internos, a lista (A...) mais curta resultante será chamada de <lista></em de parâmetros externos>.
<li>O tipo Vde retorno do corpo, se nãovoid for, determina o tipo de uma variável de estado adicional do loop. O corpo deve aceitar um parâmetro à esquerda e retornar um valor desse tipo V.
<li>Se init nãonull for, ele deve ter o tipo Vde retorno. Sua lista de parâmetros (de algum formulário <c>(A*)</c>) deve ser efetivamente idêntica à lista (A...)de parâmetros externos.
<li>Se init for null, a variável de loop será inicializada para seu valor padrão #empty.
<li>Se o iterator identificador nãonull for, ele deverá ter o tipo java.util.Iterator de retorno ou um subtipo. O iterador que ele produz quando o loop é executado será assumido para produzir valores que podem ser convertidos em tipo T.
<li>A lista de parâmetros de um iterator que não seja (null de algum formulário (A*)) deve ser efetivamente idêntica à lista (A...)de parâmetros externos.
<li>Se iterator é null padrão para um identificador de método que se comporta como java.lang.Iterable#iterator(). Nesse caso, a lista (V T A...) de parâmetros interna deve ter pelo menos um A tipo e o parâmetro de identificador de iterador padrão é ajustado para aceitar o tipo à esquerda A , como se fosse pelo MethodHandle#asType asType método de conversão. O tipo à esquerda A deve ser Iterable ou um subtipo. Esta etapa de conversão, feita no tempo de construção do loop, não deve gerar um WrongMethodTypeException.
</ul>
O tipo T pode ser primitivo ou referência. Como o tipo Iterator<T> é apagado no método manipula a representação para o tipo Iteratorbruto, o iteratedLoop combinador ajusta o tipo de argumento à esquerda como bodyObject se fosse pelo MethodHandle#asType asType método de conversão. Portanto, se um iterador do tipo errado aparecer à medida que o loop for executado, exceções de runtime poderão ocorrer como resultado de conversões dinâmicas executadas por MethodHandle#asType(MethodType).
O tipo de resultado e a assinatura de parâmetro do identificador de loop resultante são determinados da seguinte maneira:<ul<>li>O tipo de resultado do identificador de loop é o tipo V de resultado do corpo.
<li>Os tipos de parâmetro do identificador de loop são os tipos (A...)da lista de parâmetros externos.
</ul>
Aqui está o pseudocódigo para o identificador de loop resultante. No código, V/v represente o tipo/valor da variável de loop, bem como o tipo de resultado do loop; T/t, o dos elementos da estrutura em que o loop itera e A.../a... representa argumentos passados para o loop.
<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>
Adicionado em 9.
Partes desta página são modificações baseadas no trabalho criado e compartilhado pelo Android Open Source Project e usadas de acordo com os termos descritos na Licença de Atribuição Creative Commons 2.5.