02Groovy语法(一)

Groovy语法直接来源于java的语法特性。
比如:
关键字和语句都是和java类似。
类,接口,属性,方法的定义。
Groovy也是使用new来创建对象的。
Groovy也会自动的导入许多包:
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.util.regex.*
java.net.*
java.io.*

异常处理也是try/catch/finally机制
运算符,表达式,赋值
控制结构
代码注释
等等这些都是和java语法类似的。

数值与表达式

数值

Groovy中所以东西都是对象。整数(-1,200,20)都是Integer类的对象。

定义变量(动态类型):def price = 100

等同于:Integer price = new Integer(100);
groovy语句可以不使用逗号结尾。

也是支持自动的拆箱和装箱。
3.times{println “Hello”}:打印三次。这个在Java中无法实现的。(把3看做一个对象;所以对象.方法是正常的)
浮点数:1.5,-3.14都是BigDecimal类的对象。
数值类型:
Integer 15 Long 100L,100l
Float 1.23F Double 1.25D
java.math.BigInteger 123g,456G(无小数点)
java.math.BigDecimal 1.23g,1.23G(有小数点)

GDK中的数值方法:

def store = ''
10.times{store += 'X'}:执行10次。
1.upto(5){number -> store += number}:数字从1,到5(这里是一个闭包:number作为参数)
2.downto(-2){number -> store+= number+''}:从大到小。
0.step(0.5,0.1){number -> store += nubmer + ''}:从0开始,一直长到0.5,每次长0.1。后面又是一个闭包。

运算符

基于方法的运算符。
a==b 等价于 java中的 a.equals(b)
Groovy中的===就是java中的==
Groovy支持操作符重载,重载运算符对应的方法就是操作符重载。(实际上就是方法的重载)
<<操作符被重载,以支持向集合中添加项。
?=安全引用操作符(防止空指针异常),在方法调用前添加一?就相当于在调用前面放了一个条件,可以防止在null对象上调用方法。?操作符非常有用,可以极大减少条件语句。
基于方法的运算符:
02Groovy语法(一)_第1张图片
注意最后三个比较方法,大于返回1,等于返回0,小于返回-1.

这些方法可以到GroovyConsole中去验证:Ctrl+Enter执行。(断言成功返回null)

字符串简介

字符串GString简介

def str = “hello”;print str//同行中多个语句,‘;’不能少哦
def name = ‘xiaoxiao’
print “${name}“:引用name变量的值
Groovy中字符串可以使用单引号或双引号括起来(可以在其内部加入\n等转义字符),但是java中不行,java中单引号用来包含单个字符,双引号才能包含字符串。
原格式输出:三个单引号。不用像java中使用+号来连接字符串。

print  ''' 
    aaa
    bbb
'''

三个双引号:内部就可以使用${}来获取变量的值。

print """
    \taaa
    ${name}
    \nbbb
"""

Groovy中的方法

Groovy中可以直接使用java方法。
变量作用域与java方法类似。
可以使用动态类型或静态类型:
安全引用时使用静态类型。OR映射时使用静态类型,指定变量类型与数据库列匹配。

可以省略return,默认返回最后语句的值

定义方法

def fun(name){
    println "Hello ${name}"//默认返回最后一句值,没有使用return语句。
}

执行方法

fun(“小名”)

Groovy方法的默认参数

这个在java中也是不被支持的。
def fun(name,welcomeStr=’Hello’){
print “ welcomeStr {name}”
}
func(“小明”)//输出 Hello 小明
func(“小明”,”翻译”)//输出:翻译 小明

调用方法时,优先选择匹配参数个数的方法。

例如上面的第一个定义的fun()和第二个定义的fun();当只传入一参数是就是调用第一fun()。
也可以通过指定具体参数的类型,来进行匹配。

Groovy方法的参数:值传递还是引用传递?

def printName(name){
println “before namename=printlnafter {name}”
}

def name = “SS”
printName(name)
输出:before SS
after “小明”
println “${name}”:输出:SS

可见Groovy方法参数是值传递。

控制流程

循环

def count = 1;def limit = 5
while(count <= limit){
    println "count: ${count}"
    count++
}
for(i = 0;i<5;i++){pirntln "hello"}
for(i in [1,2,3,4,5]){//可以用在范围或映射或GSting上
    print i
}
breakcontinue与java一样。

判断

  • if(1){println “Goog”}//输出:Goog

  • def a
    if(a){println “good”}
    else{print ‘null’}

  • def b = []
    if(b){println “good”}
    else{print ‘null’}

  • def c = [1:”FF”,2:”DD”]
    if(c){println “good”}
    else{print ‘null’}

结论:if的条件除了是布尔值外,可以可以是对象,空表示FALSE,否则为TRUE

switch语句

A:java类似的

switch(4){
case 1: pirntln "One" ;break
case 2: println "Two" ; break
.....
default: println "Default"
}

B:Groovy特性

def var = 0
switch(var){
case 0:    println "One"
case 11..20:     println "Two"//var 值在11-20范围之间
case '10':  println "Three"
case [1,2,3]:  println "Four"//一个列表中的元素。
case Float:    println "Five"//1.5F满足float类型
case {it % 3 == 0}: println "Six"//满足闭包条件
case ~'[0-9]{3}': println "Seven"//正则
default : println "default"
}

控制台输入与输出

读取标准输入:

def name = new BufferedReader(new InputStreamReader(System.in)).readLine()
println “your name is :${name}”
System.in.readLine()已经被废除了,在Groovy中使用会出错。

标准输出:

print 不换行
println 换行

格式化输出 :printf

printf(“%d-%f-\n[%s][%10s][%-10s]”,[5,5.2,’sdfs’,’sdfsd’])
%d:按整型数据
%f:按浮点类型输出
%-10s:宽度10,左侧输出字符串

我们可以通过GroovyConsole小工具来验证代码片段

注意:Groovy编程,可以是脚本,也可以重构为Groovy类。
Groovy中==与java中的不同

你可能感兴趣的:(Groovy)