“<<”操作符在Java语言里被我们熟知的是位运算中的左移运算符。在Groovy语言里,它依然是左移运算符,这我们都很熟悉,在这里就不再多说。而我们要说的却是除此之外,在Groovy语言里为“<<”运算符新增的功能。
一、对List对象和Set对象的操作
对于List对象,在前面的文字里我们提到过:
deflist= ['a','b','c'] list.each{ printlnit} println'-----------------------'list<<'e'list<<'f'list<<"haha"list.each{ printlnit}
不错,我们在Groovy语言里,使用“<<”运算符取代了Java语言中List类的add方法,带来了编码方面的简单和快捷。上面代码的输出结果为:
abc-----------------------abcefhaha
除了List对象外,“<<”操作符同样能够Set对象提供add功能,请看下面的例子:
defset= ['a','b','c'] asSetset.each{ printlnit} println'-------------------------'set<<'i'set<<'j'set<<'b'set.each{ printlnit}
为Set对象add元素同样简单,下面是它的输出结果:
acb-------------------------iacjb
为了验证Set对象的特性,我特意给set对象多add了一个“b”字符串,最后打印的结果证明了Set对象的特性:1.没有顺序;2.没有重复的元素。
二、对StringBuffer对象的操作
在Java语言中,对StringBuffer对象的操作如下:
StringBuffersb=newStringBuffer() sb.append('I can say my ') sb.append('a') sb.append('b') sb.append('c') System.out.println(sb.toString())
打印结果为:
I can say my abc
而Groovy语言中,同样是使用“<<”操作符来对append方法进行简化的:
defsb=newStringBuffer() sb<<'I'sb<<' can say'sb<<' my a'sb<<'b'sb<<'c'printlnsb.toString()
打印结果为:
I can say my abc
三、对流对象的操作
在Java语言中,对流对象的操作通常是read和write,请看下面的例子:
try{ OutputStreamWriterwtr=newOutputStreamWriter(newFileOutputStream("TheOutput.txt")); wtr.write("abc"); wtr.close(); } catch(Exceptione) { e.printStackTrace(); }
而上面的例子在Groovy语言中将是下面的样子:
1. def wtr= new OutputStreamWriter(new FileOutputStream('TheOutput.txt')) 2. wtr<< 'abc' 3. wtr.close()
不错,是使用“<<”操作符代替了write方法。
四、其他
除了上面的一些对“<<”操作符的常用方法,在Groovy语言中,还有一些不常用的地方也会使用到“<<”操作符。请看下面的例子:
classEmpl { Stringnamestaticvoidmain(args) { Empl.metaClass.nameInUpperCase<< {->delegate.name.toUpperCase() } defb=newEmpl(name:"Tom") printlnb.nameInUpperCase() } }
在这里,“<<”操作符是赋值的意思,即将后面的闭包赋给Empl.metaClass.nameInUpperCase。整个语句与下面的语句等同:
Empl.metaClass.nameInUpperCase = {-> delegate.name.toUpperCase()}