groovy是运行在jvm上的语言,语法上跟java基本类似,可以使用java所有的api。所以如果有java基础的话,学习groovy是非常轻松的。
一、groovy中的变量
1、类型 java中所有的基本类型,但是和java的区别是groovy中类型最终都是对象类型。 2、定义 a、强类型:直接定义类型 b、弱类型:def类型(可改变类型,类似于js中的var)
二、String详解
groovy中对字符串的处理扩展了很强大的功能,操作起来非常的方便。
1、定义方式 1.1、单引号定义:和java中双引号定义一样 1.2、双引号定义:
def age = 1
//扩展内容还可以是表达式
def string = "my age is ${age}"
1.3、三引号定义:定义有格式的字符串,如一段html代码。 1.4、延迟加载 嵌入的闭包表达式仅仅允许携带0或者1个参数。 闭包作为表达式比普通插值表达式有一个很有用的特性:延迟加载。
def b = 'old'
def value1 = "${b}"
def value2 = "${->b}"
assert value1 == "old"
assert value2 == "old"
b = "new"
assert value1 == "old" //使用纯插值表达式,结果在GString创建时结合
assert value2 == "new" //但使用闭包表达式,GString被强转为Sring时,闭包被调用,并产生包含新数值的更新字符串。
1.5、斜杠字符串 除了通常的带引号字符串,groovy提供斜杠字符串,使用/作为分隔符。斜杠字符串对于定义正则表达式和模式是特别有用的,因为不需要转义反斜杠。只有正斜杠需要反斜杠转义。斜杠字符串支持多行,支持插值。
2、String的方法 2.1、java中String原有的方法 2.2、DefaultGroovyMethods:groovy核心类,下面是groovy官网对这个类的描述 这个类定义了出现在groovy环境中的普通JDK类上的新的groovy方法。使用静态方法时,第一个参数是目标类,即public Static String reverse(String self)为String提供了一个reverse()方法。 注意:虽然这个类包含许多“公共”静态方法,但它主要被视为一个内部类(它的内部包名也表明了这一点)。在Groovy中使用时,我们重视这些方法的向后兼容性,但在Java方法调用级别上,我们不重视向后兼容性。也就是说,Groovy的未来版本可能会删除或移动此文件中的方法调用,但通常的目标是使方法在Groovy中可用。 2.3、StringGroovyMethods:继承自DefaultGroovyMethods,重写了许多DefaultGroovyMethods的方法,使这些方法更适用于String。
3、String常用的方法 3.1、字符串填充
// center(Number numberOfChars,CharSequence padding) ,将字符串作为中心进行填充
def str = "groovy"
println str.center(5,"a") //结果:groovy
println str.center(6,"a") //结果:groovy
println str.center(7,"a") //结果:groovya
println str.center(8,"a") //结果:agroovya
println str.center(9,"a") //结果:agroovyaa
println str.center(8) //结果: groovy ,不传padding代表以空格填充
//PS:当numberOfChars小于或等于str本身的长度时,不进行填充操作,大于则用pandding扩展至长度numberOfChars,从字符串的右边(尾)进行填充,再到左边(头)
//padLeft(Number numberOfChars,CharSequence padding) ,在字符串的左边进行填充
//c. padRight(Number numberOfChars,CharSequence padding),在字符串的右边进行填充
3.2、字符串比较 3.2.1、操作符比较
def a = "a"
def b = "b"
//比较的是字符串ASCII码的大小,等价于a.compareTo(b) == 1
println a > b
结果为:false
3.2.2、方法比较:compareTo
3.3、获取字符串的字符
def abc = "abc"
println abc[0] == "a"
结果为:true
3.4、字符串中的减法(取差集)
println abc - "ab"
println abc - "d"
println abc - "abcd"
结果为:
c
abc
abc
3.5、其他方法
//String getAt(int index) 字符串的下标运算符
assert "abcdefg".getAt(2) == "c"
assert "abcdefg"[2] == "c"
assert "abcdefg".getAt(1..2) == "bc" //String getAt(Range range)
assert "abcdefg"[1..2] == "bc"
//Int indexOf(String str) 返回给定子字符串在当前字符串中首次出现的索引值
assert "abcdefg".indexOf("b") == 1
assert "abcd".indexOf("g") == -1 //如果原字符串中不存在给定子字符串就返回-1
//StringBuffer leftShift(Object value) 重载<< 使两个字符串相加,返回一个新的字符串
assert "ab".leftShift("cd").class == java.lang.StringBuffer
assert "ab".leftShift("cd").toString() == "abcd"
//int length() / int size() 返回字符串的长度
assert "abcd".length() == 4
assert "abcd".size() == 4
//String concat(String str) 在字符串后添加str字符串
assert "ab".concat("12") == "ab12"
//Boolean endsWith(String suffix) 测试字符串是否以给定的后缀结尾
assert "demo1".endsWith("1") == true
//String minus(Object value) 删除字符串中value部分
assert "abcd".minus("bc") == "ad"
//String next() 按字典顺序增加给定字符串末尾字符顺序
assert "abcd".next() == "abce"
assert "abc1".next() == "abc2"
//String previous() 按字典顺序增加给定字符串末尾字符顺序
assert "abcd".previous() == "abcc"
assert "abc1".previous() == "abc0"
//String padLeft(Number numberOfCharacters) 与center()用法类似,在元字符串左边填充空格字符
assert "abcd".padLeft(5) == " abcd"
//String padLeft(Number numberOfCharacters,String padding) 与center()用法类似,在元字符串左边填充padding字符
assert "abcd".padLeft(5,"12") == "1abcd"
//String padRight(Number numberOfCharacters) 与padLeft()用法类似,在元字符串左边填充空格字符
assert "abcd".padRight(5) == "abcd "
//String padRight(Number numberOfCharacters,String padding) 与padLeft()用法类似,在元字符串左边填充padding字符
assert "abcd".padRight(5,"12") == "abcd1"
//String plus(Object valus) 字符串相加
assert "abcd".plus("123") == "abcd123"
//String reverse() 创建当前字符串的逆序字符串
assert "abcd".reverse() == "dcba"
//String substring(int beginIndex) 返回一个当前字符串的指定索引开始的子字符串
assert "abcd".substring(1) == "bcd"
//String substring(int beginIndex,int endIndex) 返回一个当前字符串的指定索引开始的子字符串
assert "abcd".substring(1,2) == "bc"
//Character toCharacter()
//Double toDouble()
//Float toFloat()
//Integer toInteger()
//Long toLong() 字符串类型转换
//List toList() 将指定的字符串转换成一个由单个字符组成的字符串列表
assert "abcd".toList() == ["a","b","c","d"]
//String toUpperCase() 将当前字符串对象的所有字符转换为大写
assert "abcd".toUpperCase() == "ABCD"
//String toLowerCase() 将当前字符串对象的所有字符转换为小写
assert "ABCD".toUpperCase() == "abcd"
//List tokenize() 使用空格作为字符串的分隔符
//List tokenize(String token) 使用指定的token参数作为字符串的分隔符
//String[] split(String regex) 使用与给定的正则表达式相匹配的子字符串将字符串分隔为多个字符串
// Boolean matches(String regex) 测试字符串是否匹配给定子字符串
三、逻辑控制
1、if/else 与java中一致
2、switch/case java中switch只能传入int类型、byte,char和short类型能自动提升为int类型、String类型和后来扩展的enum类型。而在groovy中,switch可以传入任意类型。
//在groovy中,switch可以传入任性类型的数据进行匹配
static String judgeType(Object x) {
def result
switch (x) {
case "string":
result = "x is string"
break
case [4, 5, 6, 7,'inList']: //列表(数据结构中讲解)
result = "x is in list [4, 5, 6, 7,'inList']"
break
case 10..15: //范围range(数据结构中讲解)
result = "x is in range 10..15"
break
case Integer:
result = "x is Integer"
break
case BigDecimal:
result = "x is BigDecimal"
break
case List:
result = "x is List"
break
default:
result = "no match"
break
}
return result
}
def x = "string"
def x1 = 5
def x2 = 10
def x3 = 3
def x4 = 3.14
def x5 =[4,6]
def x6 ="hi groovy"
def x7 = "inList"
println judgeType(x) //x is string
println judgeType(x1) // x is in list [4, 5, 6, 7,'inList']
println judgeType(x2) // x is in range 10..15
println judgeType(x3) // x is Integer
println judgeType(x4) // x is BigDecimal
println judgeType(x5) // x is List
println judgeType(x6) // no match
println judgeType(x7) // x is in list [4, 5, 6, 7,'inList']
3、while循环 同java
4、for循环
/*
*范围中的for循环
*/
def sum = 0
for (i in 0..9) {
sum += i
}
println sum //45
sum = 0
/*
*list中的for循环
*/
for (i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
sum += i
}
println sum //45
/*
*map中的for循环
*/
for (i in ['java': 1, ' groovy': 2, 'python': 3]) {
println "key:${i.key} value:${i.value}"
}
//key:java value:1
//key: groovy value:2
//key:python value:3