2016-07-27 24 views
1

ich in der Dokumentation und in Closure.java siehe Referenzen auf „Richtlinie“ ohne Erklärung von whgat es ist oder was es für ist,Was ist und was ist die Verwendung der Closure „Richtlinie“

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; 
} 

ich googeln es auch, aber ich fand keinen einzigen Hinweis darauf, mit Ausnahme von einigen Tests, bei denen es

assert directive = DONE 

erscheint so das einzige, was ich weiß, ist, dass es getan werden kann, oder überspringen.

Gibt es ein "reales Leben" Beispiel dafür?

Antwort

1

Diese Richtlinie Eigenschaft wird intern von der groovy Laufzeit als Schleifenabbruchbedingung in collect Operationen verwendet siehe groovy.runtime.DefaultGroovyMethods.java in groovy Quellcode:

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; 
} 

Es ist über die Getter und Setter getDirective() und setDirective() in groovy Laufzeit und über die Direktive Eigenschaft der Schließung in Ihrem Skript.

DONE wird den Sammelbetrieb

Zum Beispiel zu stoppen, nachdem 5 zu stoppen:

(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]] 

SKIP nicht verwendet ... und hat keine Auswirkungen auf dem Sammelbetrieb (?!)

Diese Funktion klingt ein bisschen wie ein Trick für Spezialfälle ist es wahrscheinlich besser, Sammlungsmethoden wie find, findAll e zu verwenden tc. wenn möglich

+0

Das ist sehr gut, und da Direktive ist ein int ich meine eigenen Richtlinien verwenden kann komplexe Logik innerhalb des Verschlusses, wie '(1..10) .collect { if (Richtlinie zu behandeln == 189) { Richtlinie = 190 neue Tuple (it, (int) (it/2)) } else { Direktive = 189 neue Tuple (it, (int) (it * 2)) } } ' Danke, ich schätze die präzise und klare Antwort. – amsmota

+0

Ihr Willkommen. Wenn ich Sie wäre, würde ich das nicht tun, zu komplex und schwer zu pflegen IMHO ... Sie würden sich in Zukunft schwer vorbereiten Ist es mit einer anderen Frage, die Sie über DSL gepostet haben, verbunden? Wenn ja, ich habe eine Antwort zu senden, fing ich an, an einem DSL-ähnlichen Werkzeug zu arbeiten und das Thema zu graben – ARA

Verwandte Themen