从 Java 到 Groovy

现在声明字符串是很容易的,这些字符串都是java.lang.String对象,我们可以调用在这些字符串上的方法或者把它们作为参数传递给一个期望的字符串,比如容易的控制台输出:System.out.print(“Hello Groovy!”);这行代码在java和groovy中是等价的,也可以使用单引号传递一个groovy字符串:System.out.print(„Hello Groovy!‟);由于这是十分通用的一个任务,GDK提供了一个快捷的语法:print(„Hello Groovy!‟);也可以删除圆括号和分号,因为这是可选的,并且在这个例子中对可读性也没有什么帮助。Groovy可以将结果浓缩为:print „Hello Groovy!‟只看最后一行,我们不能分辨出这是groovy、Ruby、Perl或者别的脚本语言中 的哪一种,看起来这行代码在某种程度上也不优雅,但是它在最简单的途径来表述问题。

列表3.3提供了java和附加的GDK交织在一起的功能,你如何来分辨每一行代码?

这些具有自我描述的例子给出了在groovy的字符串中的印象,如果读者使用过任何别的脚本语言,也许已经注意到在列表3.3缺失一个有用的函数:修改一个字符串。

groovy不能这样 做 , 因 为 字符串 是 一 个 java.lang.String对 象 实 例 , 并且java.lang.String在java中是不可变的。

在说是“蹩脚的理由”之前,groovy修改字符串的答案是:虽然不能使用String,但是可以使用StringBuffer!在StringBuffer中,可以使用<<操作符追加文本和下标操作符进行文本替换,在一个字符串上使用<<操作符将返回一个StringBuffer,下面是表3.3通过使用StringBuffer表示的等价的例子:greeting = 'Hello' greeting <<= ' Groovy' (1)追加文本和赋值一起完成 assert greeting instanceof java.lang.StringBuffer greeting << '!' (2)在StringBuffer上追加文本 assert greeting.toString() == 'Hello Groovy!' greeting[1..4] = 'i'  将子串”ello”替换为”i” assert greeting.toString() == 'Hi Groovy!' 注意:虽然表达式stringRef<<string 返回的是一个StringBuffer,但是这 个StringBuffer并没有自动赋值给stringRef(如(1)所示),在使用一个字符串的时候,这需要显示的进行赋值;但在使用StringBuffer的时候不需要这样做,在使 用StringBuffer的时候,原来存在的对象被修改(如(2)所示),在使用字符串的时候我们不能修改原来存在的对象,所以必须返回一个新的对象。

读者将进一步学到关于字符串的知识,String已经在GDK中获取到了 一些新的方法,我们已经看到了一部分,但是通过正则表达式和列表,我们将谈到更多的方法,在字符串上的GDK方法列表在附录c中列出。

在编程的时候使用字符串是非常平常的事情,在特定的编程:读文本、写文本、剪切文本、替换语法、分析内容、查找和替换等等,想想在我们的编程过程中,涉及到字符串的有多少?

Groovy在这些方面都提供了支持,但这不是全部,下一节将介绍正则表达式,正则表达式分解处理文本:这是困难的操作,但是功能极其强大。