Groovy & Gradle: JVM Automation and Build Engineering · Aula

Compreendendo closures do Groovy

Aprenda o conceito de closures, como defini-las e suas aplicações versáteis em Groovy.

Aula 2 de 411 etapas

Compreendendo closures do Groovy é uma aula grátis de Groovy & Gradle: JVM Automation and Build Engineering no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Groovy & Gradle: JVM Automation and Build Engineering, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Groovy & Gradle: JVM Automation and Build Engineering inclui 4 aulas no total.

Partes desta aula ainda não foram traduzidas e aparecem em inglês.

What Are Groovy Closures?

Welcome to the world of Groovy closures! A closure is essentially a block of code that can be treated like a variable.

Think of it as a mini-function you can define, store, and pass around. Closures are a powerful feature that make Groovy code very flexible and concise.

  • They are first-class citizens, meaning they can be assigned to variables, passed as arguments, and returned from methods.
  • They can capture variables from their surrounding scope, even after that scope has finished executing.

Basic Closure Syntax

Defining a closure is straightforward. You enclose your code block within curly braces {}. Let's see a simple example:

class Main {
  static void main(String[] args) {
    // Define a simple closure
    def sayHello = {
      println "Hello from a closure!"
    }

    // Call (execute) the closure
    sayHello()
  }
}

Closures with Parameters

Just like methods, closures can accept parameters. You list the parameters before the -> (arrow) operator, followed by the closure's body.

This allows your closure to perform operations based on the input it receives.

class Main {
  static void main(String[] args) {
    // Closure that takes two parameters
    def add = { num1, num2 ->
      return num1 + num2
    }

    // Call the closure with arguments
    def result = add(10, 5)
    println "Sum: ${result}"

    // You can also omit 'return' for the last statement
    def multiply = { a, b -> a * b }
    println "Product: ${multiply(4, 3)}"
  }
}

The 'it' Keyword

When a closure takes exactly one parameter, Groovy provides a special implicit variable called it. You don't need to declare it explicitly.

This makes single-parameter closures even more concise and readable, especially when used with collection methods.

class Main {
  static void main(String[] args) {
    // Closure using 'it' for a single parameter
    def square = { it * it }

    println "Square of 7: ${square(7)}"

    def greetPerson = { "Hello, ${it}!" }
    println greetPerson("Alice")
  }
}

Closures as Method Arguments

One of the most common and powerful uses of closures in Groovy is passing them as arguments to methods. Many Groovy methods, especially those on collections, are designed to accept closures.

If a closure is the last argument to a method, you can place it outside the parentheses, making the code look very clean and DSL-like.

class Main {
  static void main(String[] args) {
    def numbers = [1, 2, 3, 4, 5]

    // Using 'each' with a closure to iterate
    numbers.each { num ->
      println "Number: ${num}"
    }

    println "---"

    // Using 'collect' with a closure to transform
    def doubledNumbers = numbers.collect { it * 2 }
    println "Doubled: ${doubledNumbers}"
  }
}

Capturing Variables: Lexical Scope

Closures have lexical scope, meaning they remember and can access variables from the scope where they were defined, even if that scope no longer exists.

This is a key characteristic that differentiates closures from regular methods and allows them to carry context with them.

class Main {
  static void main(String[] args) {
    def name = "Groovy User" // Variable in the outer scope

    def introduce = {
      // The closure 'introduce' captures 'name'
      println "My name is ${name}."
    }

    introduce() // Calls the closure, accessing 'name'

    name = "CoddyKit Enthusiast" // Change the outer variable
    introduce() // The closure still references the updated 'name'
  }
}

Modifying Captured Variables

Not only can closures access captured variables, but they can also modify them. This creates a powerful way for closures to interact with their surrounding environment.

Be mindful when modifying external variables from within closures, as it can sometimes lead to less predictable code if not managed carefully.

class Main {
  static void main(String[] args) {
    def counter = 0 // A variable to be captured

    def increment = {
      counter++ // Closure modifies the outer 'counter'
      println "Counter is now: ${counter}"
    }

    increment() // Counter: 1
    increment() // Counter: 2
    increment() // Counter: 3

    println "Final counter value: ${counter}"
  }
}

Closure 'call()' Method

While you can execute a closure by simply using parentheses (e.g., myClosure()), closures are actually instances of the groovy.lang.Closure class.

This means they also have a call() method. Using call() is equivalent to direct execution and can sometimes be useful for clarity or when dynamically invoking closures.

class Main {
  static void main(String[] args) {
    def greet = { name ->
      println "Hello, ${name}!"
    }

    // Direct execution
    greet("World")

    // Execution using the call() method
    greet.call("Groovy")

    def add = { a, b -> a + b }
    println add.call(5, 7)
  }
}

Practical Use: Filtering Lists

Let's put closures to work with a practical example: filtering elements from a list. Groovy's collection methods, like findAll, are perfect for this.

You provide a closure that defines the condition for inclusion, and findAll returns a new list containing only the elements that satisfy that condition.

class Main {
  static void main(String[] args) {
    def numbers = [10, 25, 12, 30, 5, 45, 20]

    // Find numbers greater than 20
    def largeNumbers = numbers.findAll { it > 20 }
    println "Numbers > 20: ${largeNumbers}"

    // Find even numbers
    def evenNumbers = numbers.findAll { it % 2 == 0 }
    println "Even numbers: ${evenNumbers}"
  }
}

Closure Concepts Check

Which of the following statements about Groovy Closures are TRUE?

Recap: Understanding Closures

Great job! You've taken a significant step in understanding Groovy's powerful closures.

Here's a quick summary of what we covered:

  • Closures are code blocks treated as first-class citizens.
  • They use {} for definition and -> for parameters.
  • The it keyword simplifies single-parameter closures.
  • Closures are often passed as method arguments, enhancing Groovy's expressiveness.
  • They possess lexical scope, capturing and even modifying variables from their surrounding context.

In the next lesson, we'll explore how to apply closures to functional programming patterns in Groovy!

Grátis para começar

Aprenda Groovy com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
12
Aulas
48

Perguntas Frequentes

A aula “Compreendendo closures do Groovy” é grátis?

Sim — o texto completo de “Compreendendo closures do Groovy” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Groovy & Gradle: JVM Automation and Build Engineering, atualize para CoddyKit PRO. O curso de Groovy & Gradle: JVM Automation and Build Engineering inclui 4 aulas no total.

O que vou aprender em “Compreendendo closures do Groovy”?

Aprenda o conceito de closures, como defini-las e suas aplicações versáteis em Groovy. Você pratica Groovy & Gradle: JVM Automation and Build Engineering com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Groovy & Gradle: JVM Automation and Build Engineering?

Nenhuma experiência prévia é necessária. Groovy & Gradle: JVM Automation and Build Engineering no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Compreendendo closures do Groovy”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Groovy & Gradle: JVM Automation and Build Engineering?

Sim. Cada aula de Groovy & Gradle: JVM Automation and Build Engineering inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Aprimoramentos das coleções do Groovy
  2. Compreendendo closures do Groovy
  3. Padrões funcionais com Groovy
  4. Curry e Composição de Closures
← Voltar para Groovy & Gradle: JVM Automation and Build Engineering