MethodHandles.IteratedLoop(MethodHandle, MethodHandle, MethodHandle) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
構造一個迴圈,範圍涵蓋由 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
一個可選的 handle 用來回傳迭代器以啟動迴圈。
若非 ,null則 handle 必須回傳 java.util.Iterator 或 子型。
其他限制則見上文。
- init
- MethodHandle
可選初始化器,提供迴圈變數的初始值。
可能是 null,暗示預設的初始值。 其他限制則見上文。
- body
- MethodHandle
迴路的主體,可能不是 null。
它控制迴圈參數與結果類型(標準情況下詳見上文)。
它必須接受自身的回傳類型(若非空回傳類型)及一個 T 參數(用於迭代值),且可接受任意數量的額外類型。
其他限制則見上文。
傳回
一個包含迭代迴圈功能的方法把柄。
- 屬性
備註
構造一個迴圈,範圍涵蓋由 Iterator<T>所產生的值。 這是 #loop(MethodHandle[][]) 通用迴圈組合器的便利包裝器。
迭代器本身將由柄的評估 iterator 決定。 每個產生的值都會儲存在一個型別 T為 的迴圈迭代變數中。
若 body handle 回傳非void 型別 V,則該類型的前迴圈迭代變數也存在。 此變數會使用可選init的句柄初始化,或若該句柄為 null,則初始化為 #empty 預設值的 V 。
在每次迭代中,迭代變數會傳遞給 handle 的呼叫 body 。 從主體回傳的非void 值(型別 V為 )則更新了領先迭代變數。 迴圈處理的結果將是該變數的最終 V 值(若 void 無 V 變數則為)。
以下規則適用於參數 handles:ul>li handle 不一定是null;其型態必須為 (V T A...)V,其中 V 是非void ,否則 (T A...)void。body><< (在這種情況下 void ,我們將型別 void 指派給名稱 V,並 (V T A...)V 假設某個 void 型別 V 會悄悄從參數列表中移除,留下 (T A...)V。) <li>主體的參數清單 (V T A...) 會貢獻於一個稱為 <em>內部參數列表</em> 的類型列表。 它會限制其他迴圈部分的參數清單。
<li>作為一個特殊情況,若主體僅V貢獻 和 T 類型,且無額外A類型,則內部參數列表會由 handle 的iterator參數類型A...擴展;若是null,則加入單一類型Iterable並構成A...列表。
<li>如果從內部參數列表中刪除迭代變數類型 (V T) ,所產生的較短列表 (A...) 稱為 <em>外部參數列表</em>。
<li>若非void ,則 body return 類型 V,決定迴圈中額外狀態變數的類型。 主體必須同時接受一個導向參數,並回傳此類型的 V值。
<li>如果 init 非null ,則必須具有返回類型 V。 其參數列表(形式 <為 c>(A*)</c>))必須與外部參數列表 (A...)實質上相同。
<li>如果 init 是 null,迴圈變數將初始化為其 #empty 預設值。
<如果>iterator handle 是 non-null,則必須具有 return 類型java.util.Iterator或其子類型。 當執行迴圈時產生的迭代器會被假設產生的值,這些值可以轉換成型別 T。
<li>非null(某種形式(A*))的參數列表iterator必須與外部參數列表 (A...)實質上相同。
<li>如果 iterator 是 null ,則預設使用一個行為類似 java.lang.Iterable#iterator()的方法代柄。 此時,內部參數清單 (V T A...) 必須至少有一個 A 型別,且預設迭代器處理參數會調整為接受首 A 位型別,就像透過 MethodHandle#asType asType 轉換方法一樣。 主導 A 類型必須是 Iterable 或其子類型。 此轉換步驟在迴路建構時執行,必須不拋出 WrongMethodTypeException。
</ul>
型別 T 可以是原始型或參考型。 由於在方法處理中,型別Iterator<T>被抹除為原始型別 Iterator,組合子會iteratedLoop像透過MethodHandle#asType asType轉換方法一樣,將 的body導引型態調整為 。Object 因此,若執行迴圈時出現錯誤類型的迭代器,執行時可能因動態轉換 MethodHandle#asType(MethodType)而產生執行時異常。
產生的迴圈句柄的結果型態與參數簽名如下:<ul<>li>迴圈柄的結果型別即為主體的結果型別V。
<li>迴圈手柄的參數類型是外部參數列表中的類型 (A...)。
</ul>
以下是產生迴圈句柄的偽程式碼。 在程式碼中,表示Vv/迴圈變數的型別/值以及迴圈的結果型別;/Tt,即迴圈所繞過結構元素的類型,並A.../a...表示傳遞給迴圈的參數。
<引用>
{@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;
}
}
</區塊引用>
新增9。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。