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