我在docs和Closure.java中看到"指令"没有解释它是什么或它是什么,
public static final int DONE = 1, SKIP = 2;
private int directive;
/**
* @return Returns the directive.
*/
public int getDirective() {
return directive;
}
/**
* @param directive The directive to set.
*/
public void setDirective(int directive) {
this.directive = directive;
}
我也用谷歌搜索了它,但我发现没有一个引用它,除了它出现的一些测试
assert directive = DONE
所以我唯一知道的是它可以完成或跳过。
有没有"现实生活"这个例子呢?
答案 0 :(得分:2)
此指令属性在groovy运行时内部用作collect操作中的循环中断条件 在groovy源代码中查看 groovy.runtime.DefaultGroovyMethods.java :
public static <T,E> Collection<T> collect(Collection<E> self, Collection<T> collector, @ClosureParams(FirstParam.FirstGenericType.class) Closure<? extends T> transform) {
for (E item : self) {
collector.add(transform.call(item));
if (transform.getDirective() == Closure.DONE) {
break;
}
}
return collector;
}
可以通过groovy运行时中的getter和setter getDirective()和setDirective()访问它 并通过脚本中闭包的指令属性。
DONE 用于停止收集操作
例如,在5:
之后停止(1..10).collect {
if (it>= 5) directive = Closure.DONE;
new Tuple(it, (int)(it/2) )
}
Result: [[1, 0], [2, 1], [3, 1], [4, 2], [5, 2]]
未使用跳过 ...并且对收集操作没有影响(?!)
此功能听起来有点像特殊情况的技巧 使用find,findAll等收集方法可能更好。 如果可能的话