Language

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できない可能性があります。 これは、標準ケースのループ パラメーターと結果の型を制御します (詳細については、上記を参照してください)。 独自の戻り値の型 (void 以外の場合) と T パラメーター (反復処理された値の場合) を受け入れる必要があり、任意の数の追加型を受け入れる場合があります。 その他の制約については、上記を参照してください。

返品

反復ループ機能を具体化するメソッド ハンドル。

属性

注釈

Iterator<T>によって生成される値を範囲とするループを構築します。 これは、#loop(MethodHandle[][]) ジェネリック ループ コンバイネータの便利なラッパーです。

反復子自体は、 iterator ハンドルの評価によって決定されます。 生成される各値は、 T型のループ 反復変数に格納されます。

body ハンドルがVvoid以外の型を返す場合は、その型の先頭ループ反復変数も存在します。 この変数は、省略可能なinit ハンドルを使用して初期化されます。または、そのハンドルがnullされている場合は、V型の #empty 既定値に初期化されます。

各イテレーションでは、イテレーション変数が body ハンドルの呼び出しに渡されます。 (V 型の) 本体から返されるvoid以外の値は、先頭の反復変数を更新します。 ループ ハンドルの実行の結果は、その変数の最終的なV値になります (または、V変数がない場合はvoid)。

引数 handle:<ul><li>body ハンドルはnullできません。その型は、Vがvoidでないフォーム (V T A...)Vである必要があります。それ以外の場合は(T A...)void。 (voidの場合は、Vという名前に型voidを割り当て、void型Vがパラメーター リストから静かに削除され、(T A...)Vを残すことを理解した(V T A...)Vを記述します)。) <li>本文のパラメーター リスト(V T A...)は、<em>internal パラメーター リスト</em> と呼ばれる型のリストに影響します。 他のループ 部分のパラメーター リストが制約されます。 <li>特別なケースとして、本体がV型とT型のみを提供し、追加のA型がない場合、内部パラメーター リストは、iterator ハンドルのA...引数型によって拡張されます。null場合は、単一の型Iterableが追加され、A...リストを構成します。 <li>内部パラメーター リストから (V T) 反復変数型が削除された場合、結果の短いリスト (A...) は <em>external パラメーター リスト</em> と呼ばれます。 <li>本文の戻り値の型 V、voidでない場合は、ループの追加の状態変数の型を決定します。 本文は、先頭のパラメーターを受け取り、この型の値を返す必要 V。 <li>initがnullでない場合は、戻り値の型がVされている必要があります。 そのパラメーター リスト (何らかの形式 <c>(A*)</c>) は、外部パラメーター リストの (A...)と実質的に同じである必要があります。 <li>initがnull場合、ループ変数は #empty 既定値に初期化されます。 <li>iterator ハンドルがnullでない場合は、戻り値の型java.util.Iteratorまたはそのサブタイプが必要です。 ループの実行時に生成される反復子は、 T型に変換できる値を生成するものと見なされます。 <li>(何らかの形式の(A*)の) nullではないiteratorのパラメーター リストは、外部パラメーター リスト(A...)と実質的に同じである必要があります。 <li>iteratorがnull場合、java.lang.Iterable#iterator()のように動作するメソッド ハンドルが既定で設定されます。 その場合、内部パラメーター リスト(V T A...)少なくとも 1 つのA型が必要です。既定の反復子ハンドル パラメーターは、MethodHandle#asType asType変換メソッドの場合と同様に、先頭のA型を受け入れるように調整されます。 先頭 A 型は、 Iterable またはそのサブタイプである必要があります。 この変換ステップは、ループ構築時に実行され、 WrongMethodTypeExceptionをスローしてはなりません。 </ul>

T型は、プリミティブでも参照でもかまいません。 Iterator<T>型は未加工の型Iteratorに対するメソッド ハンドル表現で消去されるため、iteratedLoopコンバイナは、MethodHandle#asType asType変換メソッドの場合と同様に、bodyの先頭の引数の型をObjectするように調整します。 したがって、ループの実行中に間違った型の反復子が表示された場合、 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 に追加されました。

Javaドキュメント。

このページの一部は、によって作成および共有され、に記載されている条件に従って使用される作業に基づく変更です。

適用対象