Sök…


Stängning med uttryckliga parametrar

def addNumbers = { a, b -> a + b }
addNumbers(-7, 15) // returns 8

Stängning med implicita parametrar

['cat', 'dog', 'fish'].collect { it.length() }

it är standardnamnet på parametern om du har en enda parameter och inte uttryckligen namnger parametern. Du kan valfritt också deklarera parametern.

['cat', 'dog', 'fish'].collect { animal -> animal.length() }

Konvertera metoder till stängningar

En metod kan konverteras till en nedläggning med & operatören.

def add(def a, def b) { a + b }    

Closure addClosure = this.&add
assert this.add(4, 5) == addClosure(4, 5)

Stängning med anpassat mål för metodsamtal med implicit mottagare

class MyHello {
  def sayHello() {
    "Hello, world"
  }
}

def cl = { sayHello() }
cl() // groovy.lang.MissingMethodException    
cl.delegate = new MyHello()
cl(); // "Hello, world"

Används mycket av Groovy DSL: er.

Inpackning beteende runt en stängning med en metod

Det finns ofta beteendemönster som kan resultera i mycket pannplattkod. Genom att förklara en metod som tar en Closure som en parameter, kan du förenkla ditt program. Som ett exempel är det ett vanligt mönster att hämta en databasanslutning, starta en transaktion, utföra arbete och sedan antingen begå transaktionen eller rulla tillbaka anslutningen (i händelse av fel) och sedan slutligen stänga anslutningen:

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

Skapa stängningar, tilldela egenskaper och ring

Låt oss skapa en karta och en stängning för att skriva ut hej

def exMap = [:]

def exClosure = {
    println "Hello"
}

Tilldela stängning till en fastighet på kartan

exMap.closureProp = exClosure

Samtalstängning

exMap.closureProp.call()

Produktion

Hello

Ett annat exempel - Låter skapa en klass med grundegenskaper och tilldela samma stängning till objektet för den

class Employee {
    def prop
}

def employee = new Employee()

employee.prop = exClosure

Samtalstängning genom den egenskapen

employee.prop.call()

Produktion

Hello


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow