語言

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

一個可選的 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。

的 java.lang.invoke.MethodHandles.iteratedLoop(java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle, java.lang.invoke.MethodHandle)Java 檔。

本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。

適用於