一、代码块
在代码块中用def关键字定义的变量不能在外部访问,如:
try{
def msg="Hello,world!";
}
//pringln msg;
如果运行最后一行"println msg;",则会报错。
但是,在代码块中没有用def关键字声明的变量,就可以在外部访问,如:
try{
msg="Hello,world!";
}
println msg;
已经使用def定义的变量,不能再次用def定义:
def a=10;
//def a=20;
代码块是可以嵌套的:
try{
try{
try{
println "Hello,world!";
}
}
}
二、闭包
闭包是可以引用外部上下文环境的一系列语句。可以将闭包赋予一个变量,并在稍后执行。
每个闭包都有一个返回值,默认的返回值就是该闭包中最后一行语句的结果
闭包可以访问外部的变量
def x=1;
def b={
x*2;//闭包可以访问外部的变量
}
将闭包赋予一个变量将记住该闭包创建时的上下文环境,即使运行时已经超出了原来的作用域:
def c;
try{
def m=10;
c={m};
}
println c();
在此处调用c(),即使已经超出了block的作用域,但仍能输出m的值
将一个闭包放入另一个闭包,可以创建它的两个实例:
c={e={"Hello,World";};e;}
v1=c();
v2=c();
println v1==v2//在此得出false,说明c()返回了不同的实例
可以在定义闭包时声明一些参数,之后在调用闭包时将这些参数值传入闭包:
c={n-> println "Parameter="+n;}
c(10);
可以利用参数将信息从包内导出,也就是所谓的“输出参数”
c={o,p-> o<<p};
x=[];
c(x,1);
c(x,2);
c(x,3);
println x;
在闭包中,总是可以用到一个叫做it的变量,如果没有显式的定义参数,则可以用it来引用
引用
c={"Parameter=${it}"};
println c(10);
如果没有传入任何参数,it仍然存在,但是为null
闭包的参数不能使用作用域中已存在变量的名字,除了隐式变量it:
def it=10;
c={it*it};
println c(5);//在此,隐式变量it仍然引用参数5,而非外部定义的10
参数在调用闭包时可以被命名。这些被命名的参数将被组装进一个Map,并指定给闭包的第一个参数:
def x={a,b,c->a.m+a.n+a.o-b+c;};
println x(m:10,5,n:15,6,o:20);
在调用闭包x的时候,参数m:10,n:15,o:20被组装进Map赋予形参a,5、6按顺序分别赋予形参b和c,结果是46。
我们可以在闭包内部和外部查询参数的个数:
def c={a,b,c->getMaximumNumberOfParameters();}
println c(1,2,3);
println c.getMaximumNumberOfParameters();
调用闭包的时候,可以对最后的一个或几个参数应用默认值:
def c={a,b=2,c=3->a+b+c;};
println c(1);
结果输出6
一个闭包可以在最后一个参数前添加Object[]前缀来创建可变长度的参数:
def c={a,Object[] b->a+b[0]+b[1];}
println c(1,2,3);
我们可以使用一个list参数调用闭包。如果闭包没有定义一个list类型的参数,则此参数将作为分解的参数传入闭包:
def c={a,b,c->a+b+c};
println c([1,2,3]);
闭包可以通过将第一个或前几个参数固化为常量,使用curry方法进行拷贝:
def c={a,b,c->a+b+c};
def d=c.curry(1);//拷贝闭包c,并将第一个参数a固化为常量1
println d(2,3);//调用闭包d,只需要给出剩余的参数。实际使用的参数仍然是1,2,3
在闭包中,可以结合使用curry和不定长度参数:
def c={a,Object[] b->b.each({m->a=a+m;});a;};
def d=c.curry(1);
def e=d.curry(2,3);//实际参数为1,[2,3]
def f=e.curry(4);//实际参数为1,[2,3,4]
println f(5);//实际参数为1,[2,3,4,5]
闭包可以递归调用
三、函数
首先,必须使用def关键字定义函数,函数也不能嵌套使用;
其次,函数不能访问在外部通过def定义的变量:
def c=10;
def f(){
println c;//编译通过
}
//f();//运行时报错
还可以使用特殊的语法标记&将函数赋予新的命名:
def f(){
println "Hello,world!";
}
def s=this.&f;
s();
函数可以后参数,包括输入参数和输出参数;
如果两个函数的拥有不同个数的未指定类型的参数,则可以使用相同的名称
def f(a){
println a*a;
}
def f(a,b){
println a*b;
}
f(10);
f(5,10)
函数可以有返回值:
1.如果有显示地使用return关键字,则返回return指定的返回值,其后面的语句不再执行;
2.如果没有显式地使用return关键字,则返回函数最后一行语句的运行结果;
3.如果使用void关键字代替def关键字定义函数,则函数的返回值将为null。
如果一个函数与一个闭包拥有相同的名称和参数,则调用的时候将执行函数,而不是闭包:
def f(a){
return a*10;
}
def f={a->a*20};
println f(5);//输出50而不是100
函数可以接受闭包作为参数:
def f(a,Closure c){
c(a);
}
f(10){println "Parameter a = "+it;}
与闭包相同,函数可以为参数指定默认值:
def f(a,b=10){
return a+b;
}
println f(5);//输出15
函数也会将命名的参数包装进一个Map,并赋予第一个参数:
def f(a,b){
return b+a.x+a.y;
}
println f(x:2,1,y:3);//输出6
函数与闭包的相同之处还有,函数同样支持不定长度的参数、分解list作为参数,以及递归调用。
分享到:
相关推荐
学习Groovy必备文档,包括一些经验整理等,比较详细的由繁到简讲述了Groovy的知识点。
### Groovy Script 入门知识点详解 #### 一、Groovy脚本简介 Groovy是一种灵活的面向对象的编程语言,它运行在Java平台上。由于其语法简洁且与Java高度兼容,因此对于Java开发者来说非常容易上手。Groovy不仅支持...
### Groovy and Grails Recipes 知识点概览 #### 一、Groovy by Example **1. Getting Started with Groovy** - **介绍**: 本章主要介绍了如何开始使用Groovy编程语言。对于初次接触Groovy的新手来说,这是一个很...
### Groovy速查手册知识点详解 #### 一、Groovy简介与特性 Groovy是一种为Java虚拟机(JVM)设计的动态语言。它具备完全的对象导向性、可选的类型系统、操作符定制能力、简洁的数据类型声明、闭包(Closures)、...
以下是对Groovy的一些核心知识点的详细说明: **Groovy的优势:** 1. **更高的抽象程度**:Groovy简化了Java的语法,使得开发过程更加直观和快速。例如,它不需要像Java那样编写大量的样板代码,如方法签名和...
这份"Groovy学习资料"包含了深入理解和实践Groovy所需的关键知识点,帮助开发者从零基础到能够开发实际项目并成功上线。 首先,Groovy的基础语法是学习的重点。Groovy支持与Java相似的类、接口和继承结构,但其语法...
Groovy的知识点: 1. **动态类型**:Groovy支持动态类型,这意味着变量的类型在运行时确定,无需显式声明。 2. **简洁语法**:Groovy的语法比Java更简洁,例如,可以省略分号和大括号,使得代码更具可读性。 3. **...
《Groovy in Action》这本书由Dierk König与Andrew Glover、Paul ...总之,《Groovy in Action》是一本内容丰富、涵盖广泛的知识点的书籍,无论是Groovy初学者还是有经验的开发者,都能从中获得有价值的见解和知识。
以下是一些主要的知识点: 1. **Groovy编译器**:SDK中的`groovy-3.0.6`目录可能包含了Groovy编译器,它是将Groovy源代码转换成Java字节码的工具,使得Groovy程序能够在Java平台上运行。 2. **GroovyShell和...
以下是一些从给定的压缩包文件名中可以推测出的Groovy知识点: 1. **方法定义和调用**:`qe_normal_method_01.groovy`、`qe_normal_method_test.groovy`、`qe_normal_method_00.groovy` 这些文件可能包含Groovy中的...
Groovy是一种基于Java平台的强大的、动态的编程语言,它结合了Java的静态类型检查和面向对象特性,同时提供了简洁的语法和动态语言的灵活性。...通过深入理解和熟练运用这些知识点,可以极大地提高开发效率和代码质量。
### Groovy学习笔记知识点梳理 #### 一、Groovy简介 - **概念**:Groovy是一种灵活的脚本语言,其设计初衷是为了更好地服务于Java开发者。它具备许多现代动态语言的特点,比如Python和Ruby,同时又能够无缝地与Java...
由于文件内容有些混乱,并且含有重复的词汇和一些扫描错误,以上总结的知识点基于对Groovy语言的理解和部分可识别内容的解读。在实践中,应当参考Groovy的官方文档或相关教程以获得更准确和全面的信息。
#### 三、核心知识点解析 **1. Groovy的基础** - **语法简介**:Groovy的语法与Java非常相似,但又有所扩展和改进。例如,Groovy允许省略分号,并且支持多种声明变量的方式。 - **数据类型**:Groovy支持基本的...
#### 知识点一:Java与Groovy的关系 - **定义**:Groovy是一种面向对象的编程语言,它直接运行在Java平台上,并且能够与现有的Java代码无缝集成。 - **特点**: - **语法简洁**:Groovy提供了更为简洁、动态的语法...
下面将详细阐述Groovy的一些核心知识点。 1. **动态类型与静态类型**: Groovy支持动态类型,这意味着变量在声明时无需指定类型。然而,Groovy 2.0引入了`@CompileStatic`注解,允许开发者选择静态类型检查,以...
本书旨在帮助Java开发者过渡到Groovy编程,提供了丰富的知识点和实践指导。 ### Groovy编程语言简介 Groovy是一种基于Java平台的动态语言,设计上兼容Java语法,同时提供了一些更简洁、表达力更强的语法特性。...
本文将深入探讨Groovy API的关键知识点,帮助你更好地理解和运用Groovy。 1. **Groovy对象和类**: - Groovy中的类可以继承Java类,也可以实现Java接口。 - Groovy支持动态类型和静态类型,动态类型时无需声明...