MethodHandles.IteratedLoop(MethodHandle, MethodHandle, MethodHandle) Método

Definição

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.

Documentação Java para java.lang.invoke.MethodHandles.iteratedLoop(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle).

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.

Aplica-se a