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
一个可选句柄,用于返回迭代器以启动循环。
如果不是null,则句柄必须返回 java.util.Iterator 或子类型。
有关其他约束,请参阅上面。
- init
- MethodHandle
可选初始值设定项,提供循环变量的初始值。
null可能是,表示默认的初始值。 有关其他约束,请参阅上面。
- body
- MethodHandle
循环的正文,可能不是 null。
它控制标准事例中的循环参数和结果类型(有关详细信息,请参阅上文)。
它必须接受自己的返回类型(如果非 void)加上参数 T (对于迭代值),并且可以接受任意数量的附加类型。
有关其他约束,请参阅上面。
返回
一个表示迭代循环功能的方法句柄。
- 属性
注解
构造一个循环,该循环的范围超过由一个 Iterator<T>值生成的值。 这是 #loop(MethodHandle[][]]) 泛型循环组合器的便利包装器。
迭代器本身将由句柄的 iterator 计算确定。 它生成的每个值将存储在类型的 T循环迭代变量中。
body如果句柄返回非void类型V,该类型的前导循环迭代变量也存在。 此变量是使用可选 init 句柄初始化的,或者对于类型 #empty 默认值 V (如果该句柄为 null)。
在每个迭代中,迭代变量将传递给句柄的 body 调用。 从正文(类型)V返回的非void值会更新前导迭代变量。 循环句柄执行的结果将是该变量的最终V值(如果没有voidV变量)。
参数句柄的以下规则保留:<ul<>li>句body柄不得null;其类型必须为窗体(V T A...)V,其中V为非,否则(T A...)void为非void。 (在本void例中,我们将类型void分配给名称V,我们将通过理解从(V T A...)V参数列表中悄悄地删除类型voidV,离开 (T A...)V。) <li>正文的参数列表(V T A...)有助于名为 <em>内部参数列表/em> 的类型列表<。 它将约束其他循环部件的参数列表。
<li>作为一种特殊情况,如果正文只V贡献和T类型,没有其他A类型,则内部参数列表由句柄的参数iterator类型A...扩展;如果它是null单一类型Iterable添加并构成A...列表。
<li>如果从内部参数列表中删除迭代变量类型 (V T) ,则生成的较短列表 (A...) 称为 <em>外部参数列表</em>。
<li>正文返回类型 V(如果不是void)确定循环的其他状态变量的类型。 正文必须同时接受前导参数并返回此类型的 V值。
<li>如果 init 不是,null则它必须具有返回类型 V。 其参数列表(某种形式的 <c>(A*)</c>) 必须与外部参数列表 (A...)有效相同。
<li>If init is null, the loop variable will initialized to its #empty default value.
<li>如果 iterator 句柄不是,null则它必须具有返回类型 java.util.Iterator 或其子类型。 在执行循环时生成的迭代器将假定为生成可转换为类型的 T值。
<li>非null(某种形式(A*))的参数iterator列表必须与外部参数列表(A...)有效相同。
<li>如果iteratornull默认为行为类似于java.lang.Iterable#iterator()的方法句柄。 在这种情况下,内部参数列表 (V T A...) 必须至少有一种 A 类型,并且默认迭代器句柄参数经过调整以接受前导 A 类型,就像通过转换方法一 MethodHandle#asType asType 样。 前导 A 类型必须是 Iterable 或子类型。 此转换步骤在循环构造时完成,不得引发 WrongMethodTypeException。
</ul>
类型 T 可以是基元或引用。 由于在方法句柄表示形式中清除了Iterator<T>类型,iteratedLoopIterator因此组合器会调整前导参数类型body,Object就像转换方法一MethodHandle#asType asType样。 因此,如果执行循环时出现错误类型的迭代器,则运行时异常可能是由执行 MethodHandle#asType(MethodType)动态转换导致的。
生成的循环句柄的结果类型和参数签名按如下方式确定:<ul<>li>循环句柄的结果类型是正文的结果类型V。
<li>循环句柄的参数类型是外部参数列表中的类型 (A...)。
</ul>
下面是生成的循环句柄的伪代码。 在代码中,Vv/表示循环变量的类型/值以及循环的结果类型;/Tt循环循环访问的结构元素的类型/值,并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 中添加。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。