Groovy基本语法(二)
静态import
我是*早在.net framework 3.5上使用类似import static这种语法的,用起来相当方便的说,但JDK一直没有引入这玩意儿,按道理说加上这么个小功能是很容易实现的。不过Groovy倒是带来来功能更强大的import static语法,用起来也很方便:
package plswg.edu.groovy.basic
// 将Integer类的MAX_VALUE静态成员变量引入
import static Integer.MAX_VALUE
// 将Double类的parseDoubl静态成员方法引入
import static Double.parseDouble
// 给静态引入赋予别名
import static Boolean.TRUE as T // 将Boolean.TRUE取名为T
import static Boolean.FALSE as F // 将Boolean.FALSE取名为F
// 给静态引入的方法赋予别名
import static Calendar.getInstance as now
// 代码中凡是用到MAX_VALUE, 指的都是Integer.MAX_VALUE
println MAX_VALUE
// 代码中凡是用到parseDouble, 指的都是Double.parseDouble
s = “123.123”
println parseDouble(s);
// 代码中凡是使用T的地方表示true,使用F的地方表示false
println T
println !T
println F
// 代码中凡是使用now的地方表示Calendar.getInstance
println now().get(Calendar.HOUR)
这玩意儿的主要作用就是避免重复书写哪些又臭又长的类名,随着JDK类库的不断增加,类名字是越来越长,像造句一样,import static恰好解决了这一问题,还是很贴心的。
5、分支结构语句
Groovy的结构化语句仍旧是三种:顺序结构、分支结构和循环结构,其中分支结构和循环结构增加了很多意想不到的功能,先看分支结构:
package plswg.edu.groovy.basic
// groovy中if条件分支的新规定
// groovy中,非0的数值可以表示true
int num = 0
if (num) {
println “True”
} else {
println “False”
}
println (++num ? “True” : “False”)
if (!!num) { // !!运算符可以将num转化为boolean类型
println “num=${num}为${!!num}”
}
println “”
// 引用为null时,表示false
Object o = null
if (o) {
println “True”
} else {
println “False”
}
o = new Date()
if (o) {
println “True”
} else {
println “False”
}
println “”
// 字符串为””时,表示false
String s = “”
if (s) {
println “True”
} else {
println “False”
}
s += “hello”
if (s) {
println “True”
} else {
println “False”
}
println “”
// 集合为空时,表示False
ArrayList array = new ArrayList()
if (array) {
println “True”
} else {
println “False”
}
array.add(100)
if (array) {
println “True”
} else {
println “False”
}
println “”
// groovy中switch选择分支的新规定
// switch对字符串类型的支持
print “Please input your words: ”
s = new BufferedReader(new InputStreamReader(System.in)).readLine()
switch (s) {
case “how are you”:
println “fine, thank you”
break;
case “how do you do”:
println “how do you do too”
break;
default:
println “nice to meet you”
}
// switch对集合和范围的支持
n = new Random().nextInt(101)
print “you got ${n} point, ”
switch (n) {
case [98, 99, 100]: // n为98, 99, 100这三个数字时
println “very good!!”
break;
case 90 .. 97: // n为90-97之间时
println “nice job!!”
break;
case 70 .. 89: // n为70-89之间时
println “good”
break;
case 60 .. 79: // n为60-79之间时
println “can be better”
break;
case {it > 0 && it < 60}: // n比0大且比60小时
println “too bad”
break;
case 0: // n为0时
println “nothing to say”
break;
}
首先,Groovy对boolean类型放宽了限制:
常量true和false分别表示“真”和“假”;
null表示false,非null表示true;
空字符串””表示false,非空字符串表示true;
0表示false,非0表示true;
空集合表示false,非空集合表示true;
好了,从这一角度上,Groovy确实和Javascript或者PHP非常相似了,用起来非常方便。
Groovy中对于switch语句的修改也是非常夸张的,这让我甚至有些怀疑Groovy中的switch是否还能达到O1的执行效率,因为Groovy的swtich表现的太像嵌套的if…else if了,在例子中,switch的case后面可以跟随如下几种玩意儿:
常量,在Groovy中,case后的常量包括数值型常量或字符串类型常量,方便很多了,JDK7中新增加了使用字符串常量的case语句,而在.net framework 1.1中早就有了,诸如Basic,PHP,Python,Javascript等脚本,更是一开始就支持字符串常量的case语句;
Range:即范围,语法 n1 .. n2 表示n1和n2之间的所有数值n(n1 <= n <= n2);
Collection:集合,语法 [a1, a2, a3, … , an],表示由中括号中的n个元素构成的集合,其中各个元素类型不必统一;
闭包:由 { 语句 } 构成的匿名函数体,这个后面会重点讲述,这里只要知道,一旦case之后的闭包返回true,则冒号之后的代码将会执行;
总之Groovy对分支语句的改造,让其更符合主流动态语言的特点,目前大家都在玩动态语言,就算强类型语言例如C#也在向动态语言方向靠拢,C++有泛型可以一直淡定,Java也有泛型,但那就不是个玩意儿。Groovy这下改的彻底,该有的全都有了!