MethodHandles.IteratedLoop(MethodHandle, MethodHandle, MethodHandle) Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Costruisce un ciclo che esegue l'intervallo sui valori prodotti da un oggetto 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
Parametri
- iterator
- MethodHandle
handle facoltativo per restituire l'iteratore per avviare il ciclo.
Se non lo ènull, l'handle deve restituire java.util.Iterator o un sottotipo.
Vedere sopra per altri vincoli.
- init
- MethodHandle
inizializzatore facoltativo, specificando il valore iniziale della variabile di ciclo.
Può essere null, implicando un valore iniziale predefinito. Vedere sopra per altri vincoli.
- body
- MethodHandle
corpo del ciclo, che potrebbe non essere null.
Controlla i parametri del ciclo e il tipo di risultato nel caso standard (vedere sopra per informazioni dettagliate).
Deve accettare il proprio tipo restituito (se non void) più un T parametro (per i valori iterati) e può accettare un numero qualsiasi di tipi aggiuntivi.
Vedere sopra per altri vincoli.
Valori restituiti
handle di metodo che incorpora la funzionalità del ciclo di iterazione.
- Attributi
Commenti
Costruisce un ciclo che esegue l'intervallo sui valori prodotti da un oggetto Iterator<T>. Si tratta di un wrapper pratico per il combinatore di cicli generici #loop(MethodHandle[][]).
L'iteratore stesso verrà determinato dalla valutazione dell'handle iterator . Ogni valore prodotto verrà archiviato in una variabile di iterazione del ciclo di tipo T.
Se l'handle body restituisce un tipo Vdiversovoid da , è presente anche una variabile di iterazione del ciclo iniziale di tale tipo. Questa variabile viene inizializzata usando l'handle facoltativo init o per il valore predefinito #empty di tipo V se tale handle è null.
In ogni iterazione, le variabili di iterazione vengono passate a una chiamata dell'handle body .
void Un valore non restituito dal corpo (di tipo V) aggiorna la variabile di iterazione iniziale. Il risultato dell'esecuzione dell'handle di ciclo sarà il valore finale V di tale variabile (o void se non è presente alcuna V variabile).
Le regole seguenti contengono l'argomento handle:<ul><li>L'handle non deve essere null. Il body relativo tipo deve essere del formato (V T A...)V, dove V non èvoid oppure (T A...)void. Nel void caso in cui il tipo void venga assegnato al nome Ve si scriverà (V T A...)V con la comprensione che un void tipo V viene eliminato tranquillamente dall'elenco dei parametri, lasciando (T A...)V.) <li>L'elenco (V T A...) dei parametri del corpo contribuisce a un elenco di tipi denominati <em>internal parameter list</em>. Vincola gli elenchi di parametri delle altre parti del ciclo.
<li>Come caso speciale, se il corpo contribuisce solo V e T tipi, senza tipi aggiuntivi A , l'elenco di parametri interni viene esteso dai tipi A... di argomento dell'handle iterator ; se è null il singolo tipo Iterable viene aggiunto e costituisce l'elenco A... .
<li>Se i tipi di (V T) variabile di iterazione vengono eliminati dall'elenco dei parametri interni, l'elenco (A...) più breve risultante è denominato <em>external parameter list</em>.
<li>Il tipo Vrestituito del corpo , se nonvoid, determina il tipo di una variabile di stato aggiuntiva del ciclo. Il corpo deve accettare un parametro iniziale e restituire un valore di questo tipo V.
<li>Se init è diversonull da , deve avere il tipo Vrestituito . Il relativo elenco di parametri (di una forma <c>(A*)</c>) deve essere effettivamente identico all'elenco (A...)di parametri esterni .
<li>Se init è null, la variabile di ciclo verrà inizializzata nel relativo valore predefinito #empty.
<li>Se l'handle iterator non ènull, deve avere il tipo java.util.Iterator restituito o un sottotipo corrispondente. L'iteratore che produce quando viene eseguito il ciclo si presuppone che vengano restituiti valori che possono essere convertiti in tipo T.
<li>L'elenco di parametri di un oggetto iterator che nonnull è (di qualche formato (A*)) deve essere effettivamente identico all'elenco (A...)di parametri esterni .
<li>Se iterator per impostazione predefinita è null un handle di metodo che si comporta come java.lang.Iterable#iterator(). In tal caso, l'elenco (V T A...) di parametri interni deve avere almeno un A tipo e il parametro handle dell'iteratore predefinito viene modificato in modo da accettare il tipo iniziale A , come se dal MethodHandle#asType asType metodo di conversione. Il tipo iniziale A deve essere Iterable o un sottotipo corrispondente. Questo passaggio di conversione, eseguito in fase di costruzione del ciclo, non deve generare un'eccezione WrongMethodTypeException.
</ul>
Il tipo T può essere una primitiva o un riferimento. Poiché il tipo Iterator<T> viene cancellato nella rappresentazione dell'handle del metodo nel tipo Iteratornon elaborato , il iteratedLoop combinatore regola il tipo di argomento iniziale per body su Object come se dal MethodHandle#asType asType metodo di conversione. Pertanto, se un iteratore del tipo errato viene visualizzato come viene eseguito il ciclo, le eccezioni di runtime possono verificarsi come risultato di conversioni dinamiche eseguite da MethodHandle#asType(MethodType).
Il tipo di risultato e la firma del parametro dell'handle di ciclo risultante vengono determinati come segue:<ul<>li>Il tipo di risultato dell'handle del ciclo è il tipo V di risultato del corpo.
<li>I tipi di parametro dell'handle di ciclo sono i tipi (A...), dall'elenco di parametri esterni.
</ul>
Di seguito è riportato lo pseudocodice per l'handle di ciclo risultante. Nel codice rappresentare Vv/il tipo/valore della variabile di ciclo, nonché il tipo di risultato del ciclo;/tT , quello degli elementi della struttura su cui viene eseguito l'iterazione del ciclo e A.../a... rappresentare gli argomenti passati al ciclo.
<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>
Aggiunta in 9.
Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal progetto Open Source Android e usato in base ai termini descritti nella licenza Creative Commons 2.5 Attribuzione.