(轉)Groovy的5種特殊運算符(可直接用於Play!的模板中)

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)  
def list = ['老大','老二','老三']
//常規的遍歷

list.each{
    println it

}

String printName(name){
    println name
}

//將printName作爲參數進行遍歷
list.each(this.&printName)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章