Groovy中的五种特殊运算符

论坛 期权论坛 脚本     
匿名技术用户   2021-1-7 01:40   531   0
[b]
Spread Operator(展开运算符)[/b]

一个集合使用展开运算符(*.)可以得到一个元素为原集合各个元素执行后面指定方法所得值的集合

class Person{
String name
int age
String toString(){
return "${name}:${age}"
}
}

def people = [new Person(name:'阿大',age:24),new Person(name:'阿二',age:18)]
println people*.toString()

========================

result:

["阿大:24", "阿二:18"]

[b]
Elvis Operator(二元运算符)[/b]

由于Groovy中“非空即真”,所以原java中的三元运算符可以简化为二元运算符

String name=  person.name?person.name:'unknown'// java的写法

def name2= person.name ?: "unknown" // Groovy 的写法




[b]Safe Navigation/Dereference Operator(安全占位符)[/b]
安全占位符(?.)主要用于避免空指针异常

Person user
println user.name// Throws NullPointerException
// 为避免空指针异常,需要加上一个检查,java的写法如下
if (user != null) {
println "Java FirstName = ${user.firstName}"

}
// Groovy语法的写法
println "Groovy FirstName = ${user?.firstName}"


[b]Field Operator[/b]

查了词典field operator翻译为“场算符”,就中文来讲我不好理解。所以就不翻译了。

由于Groovy自动的支持属性的getter,但有时候应某种特定的需求,需要自动写一个特殊的getter,如果有时候需要调用特殊的getter,有
时候又想调用普通POJO那样的getter,那么怎么办呢?使用Groovy的Field Operator就可以轻松的解决这个问题。实例如下:

class Todo {
String name
def getName() {
println "Getting Name"
name
}
}

def todo = new Todo(name: "Jim")
println todo.name
println todo.@name

========
result:
Getting Name
Jim
Jim


不使用Field Operator调的是写的getter

使用Field Operator调的是POJO的getter

[b]Method Closure Operator[/b]

我们知道闭包可以被作为一个方法的参数,但是怎么让一个方法作为一个方法的参数呢?Method Closure Operator就是用来解决上述问题的,它允许将一个方法当成一个闭包作为另一个方法的参数。

def list = ['老大','老二','老三']
//常规的遍历

list.each{
println it

}

String printName(name){
println name
}

//将printName作为参数进行遍历
list.each(this.&printName)
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP