6. 闭包(Closure)
闭包其实就是一段代码,但他们又是封装成一个Closure对象。可以类比为java的内部类,或者更好的是C++中的函数对象又叫仿函数(functor)。
闭包使得groovy的代码看起来更简洁,精炼。另外闭包可以使得资源处理更为简便。
例如:
new File(/testfile.txt/).eachLine {println it} // eachLine handle file close automatically
其中的it是闭包默认的变量名。
6.1 声明闭包
前面都是简单的在用的时候直接声明闭包,其实也可以将闭包复制给一个变量,便于多处使用,甚至引用一个已存在对象的方法。闭包也支持默认参数。
def linePrinter = {println it} // assign to a variable linePrinter('this line') // call class Foo { void bar(int value) { println "call int bar(int value), with params: $value" } void bar(List lst) { println "call int bar(List lst), with params: $lst" } void bar(int x, int y) { println "call int bar(int x, int y), with params: $x, $y" } } Foo foo = new Foo() foo.bar(10) // normal call Closure cls = foo.&bar // reference to foo cls(3) // call by overload detected cls([1,5,7]) cls(1,2) def benchmark(repeat, Closure alg) { start = System.currentTimeMillis(); repeat.times { alg(it) } return System.currentTimeMillis() - start } slow = benchmark(10000) { (int) it / 2 } fast = benchmark(10000, { it.intdiv(2) }) // intdiv is faster than / System.out.println("slow - fast = " + (slow - fast)) // output: slow - fast = 20 // default value def inc = { x, i = 1 -> return x + i } println inc(3) // output: 4 println inc(5, 2) // output: 7
6.2 闭包自身的方法
还记得C++的函数适配器吗?groovy也提供了这样的方法为Closer:curry(),可接受一个或多个参数。
之前已经看到了isCase方法,以进行分类。
def multiply = { x, y -> return x * y } multiply.getParameterTypes().size() // result: 2 def double_ = multiply.curry(2) println double_(3) // output: 6 [1, 2, 8, 7, 3].grep { it % 2 == 0 } // result: [2, 8] switch(8) { case { it > 3 } : println "> 3" // output: > 3 }
6.3 从闭包返回结果
闭包有两种返回结果的方式:
a. 返回最后一个表达式执行的结果,在这种情况下return是可以省略的;
b. 从闭包的任何地方返回,注意这种返回的意思是,本次计算结束,也就意味着如果闭包用在循环中,下次的循环的元素将继续被调用;
[1, 2, 3].collect { it * 2 } // same as: return it * 2,result: [2, 4, 6] [1, 2, 3].collect { if ( it % 2 == 0) return it * 2 // end current computing return it } // result: [1, 4, 3]
相关推荐
此外,Groovy支持闭包(Closures),这是其强大的功能之一,可以用来创建函数式编程风格的代码。 Groovy还提供了许多其他特性,比如元编程(Metaprogramming)、领域特定语言(DSLs)构建能力,以及对Java库的无缝...
Groovy 入门教程 Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法...
### 精通Groovy中文教程 #### 一、Groovy简介 Groovy是一种动态语言,专门为Java平台设计,提供了一种更为简洁且灵活的语法结构。Groovy并不旨在取代Java,而是作为Java的一种补充,使得开发者能够在Java环境中...
在Groovy语言中,闭包是一种强大的特性,它允许我们创建可执行的代码块,并可以在不同的上下文中使用。闭包有三个重要的变量:`this`, `owner`, 和 `delegate`,它们各自扮演着不同的角色。 1. **this**: `this`...
Groovy基础教程源码涵盖了Groovy语言的各个方面,是学习和理解Groovy语言的宝贵资源。下面将详细阐述Groovy的一些核心知识点。 1. **动态类型与静态类型**: Groovy支持动态类型,这意味着变量在声明时无需指定...
#### 四、Groovy脚本进阶 ##### 4.1 类和对象 Groovy中的类定义类似于Java,但更简洁: ```groovy class Person { String name int age void sayHello() { println "Hello, my name is $name and I am $age...
2. 支持闭包:Groovy的闭包类似于函数引用,可以作为参数传递,是函数式编程的重要组成部分。 3. 动态类型:Groovy允许不指定变量类型,它会在运行时自动推断。 4. GString:Groovy中的字符串支持占位符,如`"Hello,...
在学习Groovy的过程中,掌握闭包这一核心概念至关重要,尤其是在重构流程控制语句和方法时。本讲我们将深入探讨如何将传统的流程控制结构和方法转换为Groovy的闭包,以提高代码的可读性和可维护性。 首先,让我们...
### Groovy中文教程知识点概述 #### 一、Groovy简介与快速入门 ##### 1.1 使用Groovy - **Groovy** 是一种基于 **Java虚拟机 (JVM)** 的编程语言,它提供了简洁的语法,并且兼容Java的类库。Groovy能够直接运行在...
此外,Groovy还支持闭包、元编程等高级特性,这些特性使得Groovy在处理脚本、自动化任务以及构建工具(如Gradle)时表现出色。 总之,Groovy是Java开发者的强大工具,它提供了更高效的编码方式,降低了学习曲线,...
此外,Groovy支持闭包,这是一种强大的代码块,常用于函数式编程。 2. **动态类型**:Groovy是动态类型的,这意味着变量的类型在运行时确定,而非编译时。这种特性使得开发过程更为敏捷,减少了类型检查带来的编译...
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它与Java语言无缝集成,同时提供了动态语言的许多特性,例如动态类型、闭包(closures)和元编程等。它由James Strachan于2003年首次提出,并迅速受到了社区的...
本入门实例代码详细地涵盖了Groovy的一些核心概念和常用特性,包括字符串操作、Map的使用以及闭包等。 1. **字符串操作**: - Groovy中的字符串可以是单引号或双引号包裹的。双引号中的变量可以直接展开,单引号则...
闭包是Groovy中的一个重要概念,它类似于匿名函数,可以作为参数传递,增强了代码的可读性和可维护性。 总之,Groovy是为那些希望提高开发效率,同时又不脱离Java生态系统的开发者设计的语言。它简化了Java的许多...
Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...
Groovy提供了大量的动态特性,比如动态类型、闭包、元编程能力等,使得编写脚本或应用程序变得更加高效和愉悦。Groovy是完全兼容Java的,这意味着Java开发人员可以轻松地使用Groovy编写程序,并利用Groovy提供的强大...
- **可扩展性**:作为Java的扩展,Groovy不仅可以与Java无缝集成,还可以利用其自身的特性(如闭包和动态类型)来增强现有的Java应用程序。 - **丰富的生态系统**:得益于其与Java的紧密联系,Groovy拥有一个庞大的...