HELLO!大家好!我是咕噜大大,专注编程和单身30年!
尊重原创,请大家转载时注明该文章来自:http://blog.csdn.net/ymh198816/article/details/43817435
最近我的BOSS要开始一个新的电商项目,并初步定下开发语言为Java,因为扩展性好,安全性高,再加上中国满大街的Java开发人员和铺天盖地的Java开发资料,都让我们觉得在人力资源和开发方面会比较有保障。但是后来我们在确定开发框架的时候就拿不定主意了,有部分人认为应该使用目前普遍流行的SSH框架(Struts2+Spring+Hibernate), 还有部分人希望使用现在发展迅猛的Grails框架,因为Grails是一个站式服务的框架,开发速度会比SSH框架更快。但问题是在中国使用和了解该框架的人少得可怜,而且又是一个比较年轻的框架,稳定性和扩展性都需要经过时间的考验和积累,大部分人还是持观望的态度。更加有趣的地方在于Grails使用的不是源生的Java语言,而是使用Groovy来作为该框架的开发语言。刚好最近在做Grails框架的调研,所以就顺便写一篇Groovy的入门教程,希望能帮助更多的人了解Groovy这门语言。
根据Groovy的官方文档对该门语言的介绍,我们可以了解到Groovy有如下特性:
1. Groovy是运行在JVM(Java Virtual Machine)上的敏捷的动态语言,所以Groovy也是一门弱类型的语言,并且可以直接编译成Java字节编码,运行在任何具备Java运行环境(JVM)的设备上。
2. 摒弃了Java语言中少部分存在争议和不便于敏捷开发的部分,并结合了Ruby和Python等其它语言的优秀特性,像动态类型,闭包等,使得Groovy这门语言对开发人员更加友好并易于维护。
3. 能和所有的Java类库无缝对接。
4. 大部分语法和特性和Java类似,使得Java开发人员对Groovy这门语言的学习曲线近乎为零。
5. 新加入Assert方法,方便程序员做单元测试
安装GROOVY
接下来我们开始介绍Groovy的安装方式(MAC OS):
1. 打开你的Ternimal,并输入以下命令设置你系统中Groovy的binary文件地址:
>> export GROOVY_HOME=~/your/groovy/path
2. 并将GROOVY_HOME/bin配置进系统中path环境中,并写进bash文件中,这样就能在terminal中调用Groovy相关的命令
>> GROOVY=$GROOVY_HOME/bin
>> echo "export PATH=$GROOVY:$PATH" >> ~/.bash_profile
接下来重启你的terminal,然后输入 >>groovysh,如果你看见下面的画面,那么证明你的GROOVY安装成功了!!!
不过上面会有一个警告:????: Module [groovy-nio] - Unable to load extension class [org.codehaus.groovy.runtime.NioGroovyMethods] 貌似是没有成功加载某个class,求大牛提供解决方案和解释一下原因我是弱鸡。
GROOVY的ECLIPSE插件下载地址:
传送门:http://marketplace.eclipse.org/content/groovygrails-tool-suite-ggts-eclipse-luna-44
GROOVY文件示例:
package com.groovy.fundamental
import java.util.Date;
class basicGrammar {
def my_list = [3.1415926, "Hello World!!", new Date()];
def my_map = ['firstAttr':'咕噜大大','secondAttr':11.11,'thirdAttr':my_list];
basicGrammar() {
super();
}
public void printList_java() {
println my_list.getClass();
assert my_list.get(1) == "Hello World!!";
}
def printList_groovy() {
println my_map.getClass();
assert my_map.get('thirdAttr')[1] == "H World!!";
}
static main(args) {
def test = new basicGrammar();
test.printList_java();
test.printList_groovy();
}
}
从上面一个基本的groovy文件中,
1.我们可以发现groovy可以像Java一样使用包管理机制,同时还能引入各种Java工具类;
2. groovy文件中可以让Java和Groovy语法混合使用,因为Groovy最后也是编译成Java的字节码文件,它实际上也是一种Java文件,但加入了自己的一些特性;
3. 类的定义如同Java一样;
4. 使用def来定义变量,并根据变量的值来动态改变变量的类型;
5. 定义main方法时,不用声明方法的作用域,默认为public,也可以不用声明方法的返回参数类型,同时方法中参数也可以不用声明类型,因为Groovy本身就是一个弱类型的语言。类中的构造函数也类似;
6. 包含了assert方法,方便去做单元测试。
从上面输入的内容我们可以看见Groovy中提供的assert方法十分强大和具体,同时,Groovy中的list对象和map对象分别是java.util.ArrayList对象和java.util.LinkedHashMap对象
部分比较重要的GROOVY语法:
Groovy中定义的最重要的两种数据类型,一种是list(java.util.ArrayList)类型,另一种则是map(java.util.LinkedHashMap)类型,其中list类型在groovy中可以相当Java的数组来使用
定义list:
def my_list = [3.1415926, "Hello World!!", new Date()];
定义map:
def my_map = ['firstAttr':'咕噜大大','secondAttr':11.11,'thirdAttr':my_list];
使用for循环:
for(content in my_list) {
println content;
}
使用range变量,用法基本与与python的range变量相同:
def myRange = 0..5;
for(content in myRange) {
print content;
}
输出结果:012345
在Groovy中,你可以用“{}”定义一个"方法"来作为一个对象,并像一个String值或int值一样传入一个变量中,这就是闭包函数;在Groovy中一个闭包函数也是一个可被调用的方法:
def my_closure = {param -> println("hello ${param}");println("你好,世界!!")};
my_closure.call("咕噜大大");
如果不定义闭包函数的参数,则Groovy默认会使用“it“来代替这些参数:
def my_closure = {println("hello"+it);println("你好,世界!!")};
my_closure.call("咕噜大大");
闭包函数可以作为其它方法里的参数:
def fun(int i, Closure c) {
c.call(i)
}
使用each函数配合闭包函数循环list对象,与Jquery中的each方法类似,同时也真是each()和闭包函数的作用,list和map的长度就不那么重要了,它们可以不用for循环就能取出里面所有的值了:
["咕噜大大", "萌萌哒", "棒棒哒"].each({ item -> print item })
同时,如果闭包函数是方法里最后的一个参数,那么闭包函数可以写在方法的括号外面
["咕噜大大", "萌萌哒", "棒棒哒"].each(){ item -> print item }
又因为Groovy中调用方法时,在不引起歧义的情况下方法后面的括号可以省略
["咕噜大大", "萌萌哒", "棒棒哒"].each { item -> print item }
关于字符串的处理几乎和Java的String class一模一样,不过Groovy中新添加了“toInteger()”的方法:
println "2014".toInteger();
Groovy和Java的区别
对于定义的浮点数变量,Groovy不会将它们创建成Float或Double对象,默认下为Groovy自己定义的类型 BigDecimal,除非你显示地将该变量指定为Float或Double对象
def my_number = 3.14
在Groovy中你不能再像Java一样用“{}”去定义数组,反而你要用list去取代原先Java中的数组
<pre name="code" class="java">String[] myArray = {"咕噜大大","萌萌哒"}; 这是错的!!!
String[] myArray = ["咕噜大大","萌萌哒"]; 这才是对的!!!!
Groovy中的“==”相当于Java中的“equals()”;Groovy中“.is()”相当于Java中的“==”,用来比较两个对象是不是相等;
def x = 5;
def y = 5;
<pre name="code" class="java"> if(x == y) {
println("在X == Y条件中x和Y的值相等!");
} else if (x.is(y)) {
println("在X is Y条件中X和Y是同一个对象!");
}
输出结果是:在X == Y条件中x和Y的值相等!
在Groovy中你可以不写分号,但会引起一些错误,比如说:
class Trial {
private final Thing thing = new Thing ( ) ;
{ thing.doSomething ( ) ; }
}
这是正确可运行的
class Trial {
private final thing = new Thing ( )
{ thing.doSomething ( ) }
}
会报“MissingMethodException!”异常,因为”{ thing.doSomething ( ) }“会被认为是一段闭包函数,然后传入Thing()方法中作为它的参数
所以,建议大家还是按Java开发标准来,老老实实在每句sentence的后面写上分号!
Groovy会自动为pojo对象附上set和get方法,你不用手动去设置
JAVA的写法:
class usersBean() {
String name;
public void setName(String name) {
this.name = name
}
public String getName() {
return this.name
}
}
Groovy的写法:
class usersBean() {
String name;
}
Groovy中,在单引号里的字符串和普通的Java字符串一样,而在双引号里的字符串则能解析 ${param}中的值:
def param = "咕噜大大"
println "大家好!我是${param}!"
println '大家好!我是${param}!'
输出结果是:大家好!我是咕噜大大!
大家好!我是${param}!
方法和类都默认是public的;
“return”可以省略,会按代码块中最后一句表达式的结果来返回值.