Groovy的基础语法

Groovy 的语法融合了 Ruby、Python 和 Smalltalk 的一些最有用的功能,同时保留了基于 Java 语言的核心语法。对于Java 开发人员,Groovy 提供了更简单的替代语言,且几乎不需要学习时间。

语句

Groovy的语句和Java类似,但是有一些特殊的地方。例如语句的分号是可选的。如果每行一个语句,就可以省略分号;如果一行上有多个语句,则需要用分号来分隔。

x = [1, 2, 3] println x y = 5; x = y+ 7 println x assert x == 12

另外return关键字在方法的最后是可选的;同样,返回类型也是可选(缺省是Object)。

动态类型

像其他Script一样,Groovy 不需要显式声明类型。在 Groovy 中,一个对象的类型是在运行时动态发现的,这极大地减少了要编写的代码数量。在Groovy中,类型对于值(varibles)、属性(properties)、方法(method)和闭包(closure)参数、返回值都是可有可无的,只有在给定值的时候,才会决定它的类型,(当然声明了类型的除外)。例如:

//Groovy 动态类型 myStr = "Hello World"

由于使用了动态类型,不需要继承就可以得到多态的全部功能:

class Song{ @Property length @Property name }

class Book{ def public name def public author }

def doSomething(thing){ println "going to do something with a thing named = " + thing.name }

这里定义了两个Groovy 类,Song 和 Book。这两个类都包含一个 name 属性。函数 doSomething,它以一个 thing 为参数,并试图打印这个对象的 name 属性,但doSomething 函数没有定义其输入参数的类型,所以只要对象包含一个 name 属性,那么它就可以工作。可见, Song 和 Book 的实例都可以作为 doSomething 的输入参数。

mySong = newSong(length:90, name:"Burning Down the House")

myBook = newBook(name:"One Duck Stuck", author:"Phyllis Root")

doSomething(mySong)//prints Burning Down the House

doSomething(myBook)//prints One Duck Stuck

defdoSth=this.&doSomething

doSth(mySong)

doSth(myBook)

在例子的最后,我们还创建了doSomething的一个函数指针 doSth,最后的执行结果与调用doSoemthing是一样的。

值得注意的是:与Groovy Beta不同,在使用新的JSR Groovy类时,类里面的所有的变量都必须加上 def 关键字或者 private、protected 或 public 这样的修饰符。当然,也可以用 @Property 关键字声明成员变量。在Script中则不必。

字符串

Groovy中的字符串允许使用双引号和单引号。

当使用双引号时,可以在字符串内嵌入一些运算式,Groovy允许您使用 与 bash 类似的 ${expression}语法进行替换。可以在字符串中包含任意的Groovy表达式。

name="James"

println"My name is ${name},'00${6+1}'" //prints My name is James,'007'

Groovy还支持"uXXXX"引用(其中X是16进制数),用来表示特殊字符,例如 "u0040" 与"@"字符相同。

大块文本

如果有一大块文本(例如 HTML 和 XML)不想编码,你可以使用Here-docs. here-docs 是创建格式化字符串的一种便利机制。它需要类似 Python 的三重引号(""")开头,并以三重引号结尾。

name ="James"

text ="""

hello

there${name} how are you today?

"""

assert text!= null

println(text)

在Groovy-JSR中,不再支持下面这种多行字符串,个人觉得似乎与Here-docs功能重叠:

foo ="hello

there

how are things?"

println(foo)

对字符串的操作

1.    contains 字符串中是否包含子字符串,'groovy'.contains('oo')将返回true;

2.    count 返回字符串中子字符串出现的次数,'groooovy'.count('oo')将返回3.

3.    tokenize 根据分隔符将字符串分解成子串,'apple^banana^grap'.tokenize('^')返回['apple','banana','grape']。

4.    减操作'groovy'-'oo',结果是'grvy'。

5.    乘操作 'oo'*3,结果是'oooooo'。

Groovy主要结构

接下来将展示Groovy的一些结构,包逻辑分支,类、闭包等等。

逻辑分支

if-else语句

Groovy提供Java相同的if-else语句。

x = false

y = false

if ( !x ) {

x = true

}

assert x ==true

if ( x ) {

x = false

} else{

y = true

}

assert x ==y

Groovy也支持三元操作符。

y = 5

x = (y >1) ? "worked" : "failed"

assert x =="worked"

switch语句

Groovy的switch语句兼容Java代码,但是更灵活,Groovy的switch语句能够处理各种类型的switch值,可以做各种类型的匹配:

1.    case值为类名,匹配switch值为类实例

2.    case值为正则表达式,匹配switch值的字符串匹配该正则表达式

3.    case值为集合,匹配switch值包含在集合中,包括ranges

除了上面的,case值与switch值相等才匹配。

x = 1.23

result =""

switch ( x ){

case "foo":

result = "found foo"

// lets fall through

case "bar":

result += "bar"

case [4, 5, 6, 'inList']:

result = "list"

break

case 12..30:

result = "range"

break

case Integer:

result = "integer"

break

case Number:

result = "number"

break

default:

result = "default"

}

assertresult == "number"

Switch语句的工作原理:switch语句在做case值匹配时,会调用isCase(switchValue)方法,Groovy提供了各种类型,如类,正则表达式、集合等等的重载。可以创建自定义的匹配类,增加isCase(switchValue)方法来提供自定义的匹配类型。

循环

while和do 循环

Groovy支持Java相同的while循环,但目前暂不支持do循环

x = 0

y = 5

while ( y--> 0 ){

x++

}

assert x ==5

for循环

Groovy的for循环更简单,而且能够和各种类型的数组、集合、Map、范围等一起工作,我们稍候会详细介绍这些内容。

// iterateover a range

x = 0

for ( i in0..9 ) {

x += i

}

assert x ==45

// iterateover a list

x = 0

for ( i in[0, 1, 2, 3, 4] ) {

x += i

}

assert x ==10

// iterateover an array

array =(0..4).toArray()

x = 0

for ( i inarray ) {

x += i

}

assert x ==10

// iterateover a map

map =['abc':1, 'def':2, 'xyz':3]

x = 0

for ( e inmap ) {

x += e.value

}

assert x ==6

// iterateover values in a map

x = 0

for ( v inmap.values() )

{

x += v

}

assert x ==6

// iterateover the characters in a string

text ="abc"

list = []

for (c intext) {

list.add(c)

}

assert list== ["a", "b", "c"]

运行Groovy脚本

你可以象使用Perl一样编写Groovy脚本,不需要class,不需要Main入口点,也不需要声明变量;此外,你还可以用def语句来定义自己的函数,并在脚本中使用它。

像许多脚本语言一样,Groovy 是 在运行时解释的,无编译的代码在构建-运行周期中可以提供很多好处。运行时编译使 Groovy 成为快速原型设计、构建不同的实用程序和测试框架的理想平台。通过以下代码可以很简单的运行Groovy.

groovyHelloWorld.groovy

除了利用解释器来运行Groovy脚本外,Groovy 提供了两种不同的解释器Shell,使所有有效的 Groovy 表达式可以交互地执行:

1.    运行groovysh启动命令Shell,可以输入Groovy语句直接执行

2.    运行groovyConsole启动Swing方式的Groovy控制台,这是一个简单的Groovy编辑器

Groovy 脚本实际上是字节码级别的 Java 类。因此,还可以用 groovyc 编译 Groovy 脚本。可以通过命令行或者 Ant 使用 groovyc 以生成脚本的类文件。这些类可以用普通 java 命令运行,只要 classpath 包括 groovy.jar和asm.jar。(龙二少爷)

Posted at 09:09上午三月 03, 2006by 龙二少爷 in Groovy  |  迴響[0]

星期二一月 24, 2006

Groovy 前言

前言

Groovy 是基于 JRE 的脚本语言( Script ),和Perl,Python等等脚本语言一样,它能以快速简洁的方式来完成一些工作:如访问数据库,编写单元测试用例(Unit Test Case),快速实现产品原型等等。

Groovy 是由JamesStrachan 和 BobMcWhirter 这两位天才发明的,(JSR 241 2004 年 3 月)。Groovy 完全以Java API为基础,使用了Java开发人员最熟悉的功能和库。Groovy 的语法近似Java,并吸收了 Ruby 的一些特点,因此 Groovy 在某些场合可以扮演一种 “咖啡伴侣”的角色。

那么Groovy 和 Java 相比,有什么变化呢? Groovy 通过以下方式提供了一种敏捷的开发方式:

不用编译。

允许动态类型。

合成结构容易。 其脚本可以在普通 Java 应用程序中使用。

提供一个 shell 解析器。

这些特性使Groovy 成为一种特别容易学习和使用的语言. 我们先借用IBM Groovy教程中的例子,下面的代码利用了Freemarker模板引擎来创建一个Template对象,然后将内容打印到标准输出。例(1)是Java代码,例(2)是Groovy代码。可以看到二者非常的类似。

<code>
//简单的TemplateReader Java 类
import java.io.File;
import java.io.IOException;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class TemplateReader { 
   public static void main(String[] args){ 
       try{ 
           Configurationcfg = Configuration.getDefaultConfiguration();
          cfg.setDirectoryForTemplateLoading(newFile("C:\\dev\\projects\\http-tester\\src\\conf"));
           Template temp =cfg.getTemplate("vendor-request.tmpl"); 
           System.out.println(temp.toString());
       } catch(IOException e){
          e.printStackTrace();
       } 
   }
}
</code>

和例2 中的 Groovy 作为对比.

<pre><code>
//用 Groovy 编写的更简单的 TemplateReader
//语法目前基于Groovy 1.0-JSR3
import freemarker.template.Configuration as tconf
import java.io.File cfg = tconf.getDefaultConfiguration()
cfg.setDirectoryForTemplateLoading( newFile("C:\\dev\\projects\\http-tester\\src\\conf"))
temp = cfg.getTemplate("vendor-request.tmpl")
println temp.toString()
</code></pre>

Groovy显然精简得多:

Groovy 代码只需要更少的import 语句。此外,freemarker.template.Configuration 还使用了别名 tconf。

Groovy 允许直接使用类型为Template 的变量 tmpl 而不用声明其类型。

Groovy 不需要class 声明或者main 方法。

Groovy 不关心异常,可以不用导入Java需要的IOException。

对Groovy感兴趣吗?别忘了拜访它的主页 http://groovy.codehaus.org/ 并下载最新的Groovy发布包哦。(ray_linn)

本文以Groovy1.0-JSR3为基础,如果您发现任何章节与当前之JSR冲突或者无法运行之脚本,可以和我联系: ray_linn@hotmail.com.

Posted at 02:27下午一月 24, 2006by 龙二少爷 in Groovy  |  迴響[0]

Groovy的基础语法相关推荐

  1. 003--【工具】groovy之基础语法

    1.写作背景 目前在进行开源项目学习中,有一些项目时用gradle进行版本控制的,所以在此记录 2.参考网址 基础语法参考网址:https://www.jianshu.com/p/e8dec95c43 ...

  2. 【项目实战】快来入门Groovy的基础语法吧

    一.Groovy是什么? 1.1 与Java语言的关系 下一代的Java 语言,增强Java平台的唯一的脚本语言 跟java一样,它也运行在 JVM 中. 支持Java平台,无缝的集成了Java 的类 ...

  3. Gradle Groovy 基础语法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 一、Groovy语法(一):基础语法

    Groovy基础语法 来源:https://www.jianshu.com/p/8127742e0569 1.Groovy中的变量 1.1.变量的类型:基本类型(java中的int,float,dou ...

  5. python基础语法及知识点总结

    本文转载于星过无痕的博客http://www.cnblogs.com/linxiangpeng/p/6403991.html 在此表达对原创作者的感激之情,多谢星过无痕的分享!谢谢! Python学习 ...

  6. Gradle | Gradle构建之Groovy语言基础

    前言 Gradle的构建脚本是采用Groovy语言编写的.Groovy是Java平台上设计的一种强大的.可选类型和动态的语言.Groovy可以无缝地集成任何Java程序,并立即让你的应用程序拥有强大的 ...

  7. Groovy脚本基础全攻略

    1 背景 Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意 ...

  8. Scala语言学习一——基础语法

    什么是 Scala Scala 是一种多范式的编程语言, 其设计的初衷是要集成面向对象编程和函数式编程的各种 特 性 . Scala 运 行 于 Java 平 台 (Java 虚 拟 机 ) , 并 ...

  9. FPGA(2)基础语法 -- 按键控制led(alway@语句)

    目录 1.module 文件名(端口) 2.声明关键字 3.always@语句 代码 1.module 文件名(端口)  注:这里最好养成习惯,只在文件名后面的括号中声明引脚变量,输入输出.关键字类型 ...

最新文章

  1. system v和posix的共享内存对比 共享内存位置
  2. Python字节到大整数的打包与解包
  3. windows无法发现任何计算机或设备,Win10系统提示windows无法与设备或资源通信如何解决...
  4. Ansible8:Playbook循环【转】
  5. js opener 的使用
  6. (1)快速了解Redis
  7. android按键精灵 释放内存,【院刊】-【201408期】内存用完?院刊教你如何释放系统内存...
  8. Python实战,截图识别文字,过万使用量版本?
  9. u盘需要计算机管理权限,u易u盘需要管理员权限的文件怎么删除
  10. 与老外打交道必知英文缩写400个
  11. 如何在iPhone上关闭“请勿打扰”
  12. Python:6-1 水仙数的统计1 (4分)
  13. xiunobbs 4 mysql_轻论坛程序 - Xiuno BBS 4.0
  14. php开发-如何调用后端服务
  15. html 手机录视频,手机自带的录屏功能真是太强大了,完全秒杀第三方工具
  16. USACO-The Castle
  17. GoJS-FlowChart样例代码分析
  18. 【Transformers】第 7 章 :问答
  19. HZAU新版正方教务系统一键教学评价
  20. [osg]OSG中的颜色数组,法向数组

热门文章

  1. 搭建IBM z/OS 1.9(ADCD 1.9)
  2. loadrunner简介
  3. 计组之I/O系统:1、I/O系统基本概念
  4. 1-2:学习shell之导航文件系统
  5. poj2393 其它贪心 挑战程序设计竞赛
  6. USACO-Section1.5 Arithmetic Progressions(枚举)
  7. Windows安装.net Framework时安装不上,提示已处理证书链,但是在不受信任提供程序信任的根证书中终止
  8. 5. OD-把限制的功能恢复,把阉割的功能添加(未注册版本,部分功能不可使用的修改)
  9. 设计模式-结构型模式-装饰模式
  10. 集群和分布式部署有什么区别?