खोज…


स्पष्ट मापदंडों के साथ बंद

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


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow