用了一段时间的ruby再回来继续看Java,感觉在语法的优雅程度以及完成相同的功能所需要的代码量确实都相差甚远,不过好在现在java虚拟机上运行的程序也不一定要完全用java语言来开发,打算尝试下jvm上的多语言编程,备选目标有JRuby、Scala和Groovy,考虑到只是为了和Java语言协助开发,同时考虑到对Java框架的支持,以及发现intellij idea不需要额外插件就支持Groovy,就选择了Groovy进行学习。
Groovy支持整数和浮点数,没有小数点的数值默认为整数,都是Integer类的实例,包含正数、负数和零;有小数点为浮点数,是BigDecimal类的实例,必须避免以小数点开始。
需要特殊注意的是,整数除以整数得到的结果一定是一个浮点数,如果想要只取整数部分值,使用intdiv方法,如:
13.intdiv(5)结果是2;求模运算中包含浮点数是非法的,会提示mod方法被错误地调用。
(1)Groovy运算符都是对象某方法的重载,如:
5 + 3 => 5.plus(3)
5 - 3 => 5.minus(3)
5 * 3 => 5.multiply(3)
5 / 3 => 5.divide(3)
5 % 3 => 5.mod(3)
(2)运算符优先级相对于C语言没什么特殊
Groovy使用def来申明一个变量,变量命名规则:
必须由字母和数字组成
大小写敏感
首字母必须是字母
下划线允许出现在命名中,以字母看待
不允许为关键字
(1)Groovy除了可以使用单引号(')和双引号(")来封装字符串外还支持三引号("""),三引号表示字符串包含多行文本与ruby的here doc类似,如
"""hello Groovy and Java"""
同时,单引号中的字符串不能用内插,规则与ruby相同,如:
def age = 24 'My age is ${age}' //My age is ${age} "My age is ${age}" //My age is 24 """My age is ${age}""" //My age is 24 "My age is \${age}" //My age is ${age}
(2)通过字符索引获取子字符串,支持如下几种格式:
def str = "Hello world" str[4] //o str[-1] //d str[1..2] //el str[1..<3] //el str[4..2] //oll str[4,1,6] //oew
(3)字符串的基本方法:
def str = "Hello world" 'Hello' + ' world' //Hello world 'Hello' * 3 //HelloHelloHello str - 'o world' //Hell str.size() //11 str.length() //11 str.count('o') //2 str.contains('ell') //true str.leftShift(' world') //Helloworld, 等价于str << ' world'
同Java的String对象一样Groovy的字符串值不可改变
Groovy通过包含附加方法的方式扩展了JDK中的类,String类也多了许多实用方法,详细见API
(3)字符串的比较:
str 1 == str2,等价于str1.equal(str2);str1 <=> str2,等价于str1.compareTo(str2)
(4)正则表达式:
Java中使用正则表达式主要是matches方法和replaceAll方法,Groovy中也可以使用,如:
"abc".matches("abc") //true "abc".matches("bc") //false "abc".replaceAll("bc", "")//"a"
同时Groovy支持~来定义以及匹配正则表达式:
class Test { static main(args) { def regex = ~'hello';//定义正则表达式, ~紧接则字符串双引号单引号都可以 def matcher = ("hello world" =~ "hello");//创建一个Matcher对象,~紧跟在=后面 println regex.class;//class java.util.regex.Pattern println regex;//hello, 等价于regex.toString; println matcher;//java.util.regex.Matcher[pattern=hello region=0,11 lastmatch=hello], matcher.toString() println matcher.find();//true println matcher.matches();//false if ("hello world" =~ regex) { println true;//会打印出true } if ("hello world" =~ "hello") { println true;//会打印出true } } }
可以看出if或者while中的=~ 其实相当于"string".find("sring2"或者Regex对像),而Groovy还提供了另一个匹配符 ==~ ,相当于String的matches方法。
正则表达式的^ $ * +等的运用这里就不做描述了,有兴趣的请自行产考正则表达式用法。