खोज…
स्पष्ट मापदंडों के साथ बंद
def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8
अंतर्निहित मापदंडों के साथ बंद करना
['cat', 'dog', 'fish'].collect { it.length() }
it
पैरामीटर का डिफ़ॉल्ट नाम है यदि आपके पास कोई एकल पैरामीटर है और स्पष्ट रूप से पैरामीटर का नाम नहीं है। आप वैकल्पिक रूप से पैरामीटर भी घोषित कर सकते हैं।
['cat', 'dog', 'fish'].collect { animal -> animal.length() }
क्लोजर के लिए तरीके बदलना
एक विधि और ऑपरेटर का उपयोग बंद करने के लिए परिवर्तित किया जा सकता है।
def add(def a, def b) { a + b }
Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)
निहित रिसीवर के साथ विधि कॉल के लिए कस्टम लक्ष्य के साथ बंद करना
class MyHello {
def sayHello() {
"Hello, world"
}
}
def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException
cl.delegate = new MyHello()
cl(); // "Hello, world"
ग्रूवी डीएसएल द्वारा बड़े पैमाने पर उपयोग किया जाता है।
एक विधि के साथ एक क्लोजर के आसपास व्यवहार लपेटना
अक्सर व्यवहार पैटर्न होते हैं जिसके परिणामस्वरूप बहुत सारे बॉयलरप्लेट कोड हो सकते हैं। एक ऐसी विधि घोषित करने से जो एक पैरामीटर के रूप में Closure
जाती है, आप अपने कार्यक्रम को सरल बना सकते हैं। एक उदाहरण के रूप में, डेटाबेस कनेक्शन को पुनः प्राप्त करना, लेन-देन शुरू करना, काम करना, और उसके बाद लेनदेन करना या फिर कनेक्शन (त्रुटि के मामले में) को रोलबैक करना एक सामान्य पैटर्न है, फिर अंत में कनेक्शन बंद करें:
def withConnection( String url, String user, String pass, Closure closure) {
Connection conn = null
try {
conn = DriverManager.getConnection( url, user, pass )
closure.call( conn )
conn.commit()
} catch (Exception e) {
log.error( "DB Action failed", e)
conn.rollback()
} finally {
conn?.close()
}
}
withConnection( DB_PATH, DB_USER, DB_PASS ) { Connection conn ->
def statement = conn.createStatement()
def results = statement.executeQuery( 'SELECT * FROM users' )
// ... more processing ...
}
क्लोजर बनाएं, संपत्तियों को असाइन करें और कॉल करें
चलो एक नक्शा और हेल्लो प्रिंट करने के लिए एक क्लोजर बनाते हैं
def exMap = [:]
def exClosure = {
println "Hello"
}
नक्शे में एक संपत्ति को बंद निरुपित करें
exMap.closureProp = exClosure
बंद होने का आह्वान
exMap.closureProp.call()
उत्पादन
Hello
एक और उदाहरण - आओ हम मूल संपत्ति के साथ एक वर्ग बनाते हैं और उसी वस्तु को बंद करने का अधिकार देते हैं
class Employee {
def prop
}
def employee = new Employee()
employee.prop = exClosure
उस संपत्ति के माध्यम से कॉल बंद करें
employee.prop.call()
उत्पादन
Hello