使用Closure"指令"是什么和什么?

时间:2016-07-27 09:32:37

标签: groovy closures

我在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

所以我唯一知道的是它可以完成或跳过。

有没有"现实生活"这个例子呢?

1 个答案:

答案 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等收集方法可能更好。 如果可能的话