`

Groovy运算符

阅读更多

Spread Operator(展开运算符)

 

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

 

Groovy代码

 

   1. class Person{  

   2.     String name  

   3.     int age  

   4.     String toString(){  

   5.         return "${name}:${age}"  

   6.     }  

   7. }  

   8.   

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

  10. println people*.toString()  

  11.   

  12. ========================  

  13.   

  14. result:  

  15.   

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

 

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"]

 

 

 

Elvis Operator(二元运算符)

 

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

 

Groovy代码

 

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

   2.   

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

 

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

 

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

 

 

 

 

 

Safe Navigation/Dereference Operator(安全占位符)

安全占位符(?.)主要用于避免空指针异常

 

Groovy代码

 

   1. Person user  

   2. println user.name// Throws NullPointerException  

   3. // 为避免空指针异常,需要加上一个检查,java的写法如下  

   4. if (user != null) {  

   5.     println "Java FirstName = ${user.firstName}"  

   6.   

   7. }  

   8. // Groovy语法的写法  

   9. println "Groovy FirstName = ${user?.firstName}"  

 

Person user

println user.name// Throws NullPointerException

// 为避免空指针异常,需要加上一个检查,java的写法如下

if (user != null) {

    println "Java FirstName = ${user.firstName}"

 

}

// Groovy语法的写法

println "Groovy FirstName = ${user?.firstName}"

 

 

 

Field Operator

 

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

 

由于Groovy自动的支持属性的getter,但有时候应某种特定的需求,需要自动写一个特殊的getter,如果有时候需要调用特殊的getter,有

时候又想调用普通POJO那样的getter,那么怎么办呢?使用Groovy的Field Operator就可以轻松的解决这个问题。实例如下:

 

Groovy代码

 

   1. class Todo {  

   2.     String name  

   3.     def getName() {  

   4.       println "Getting Name"  

   5.       name  

   6.     }  

   7. }  

   8.   

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

  10. println todo.name  

  11. println todo.@name  

  12.   

  13. ========  

  14. result:  

  15. Getting Name  

  16. Jim  

  17. Jim  

 

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

 

Method Closure Operator

 

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

 

Groovy代码

 

   1. def list = ['老大','老二','老三']  

   2. //常规的遍历  

   3.   

   4. list.each{  

   5.     println it  

   6.   

   7. }  

   8.   

   9. String printName(name){  

  10.     println name  

  11. }  

  12.   

  13. //将printName作为参数进行遍历  

  14. list.each(this.&printName)  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics