Groovy初體驗:構建高性能JVM應用


爲何要學Groovy

Groovy運行於JVM之上,然而其對動態語言函數式編程範式以及元編程功能的加持所帶來的表現力和簡潔性能夠說甩了Java幾條街。咱們能夠利用Groovy的全部動態功能構建高性能的JVM應用、將開發效率提升幾個數量級! 這就是咱們爲何要學它!編程

注: 本文首發於 My 公衆號 CodeSheep ,可 長按掃描 下面的 當心心 來訂閱 ↓ ↓ ↓vim

CodeSheep · 程序羊


Groovy環境部署

本文實驗所用OS爲CentOS7,這裏介紹使用sdk工具來安裝Groovy的方法。安全

  • 首先在命令行下執行:

curl -s get.sdkman.io | bashbash

炫酷得一腿!

  • 接下來執行:

source "$HOME/.sdkman/bin/sdkman-init.sh"服務器

  • 而後咱們就可使用sdk工具來安裝Groovy:

一句話搞定!框架

sdk install groovycurl

sdk install

  • 完成以後咱們來檢查Groovy安裝狀態

groovy -v函數式編程

一切就緒函數

image.png


Hello World From Groovy

[root@localhost ~]# vim Hello.groovy
[root@localhost ~]# more Hello.groovy 
println "Hello World From Groovy !"
[root@localhost ~]# groovy Hello
Hello World From Groovy !
複製代碼

Groovy語言特性

  • Groovy是輕量級的Java
  • Groovy的信噪比比Java高:較少的代碼得到更多結果
  • GDK = Groovy JDK:經過向JDK的各類類中添加便捷方法,Groovy擴展了JDK造成了GDK庫
  • return語句可選,分號結尾可選
  • 方法和類默認public
  • 導航操做符可幫助實現對象引用不爲空時方法纔會被調用
  • Groovy不強迫捕獲本身不關心的異常,沒捕獲的異常自動傳到高層
  • 靜態方法內可以使用this來引用Class對象,所以能夠鏈式調用!

兩大優勢:表現力 + 簡潔!!!微服務


從Java到Groovy

用Java寫一段代碼以下:

public class Greetingss {

  public static void main( String[] args ) {
    for( int i=0; i<3; i++ ) {
      System.out.println("ho ");
    }
    System.out.println("Merry Groovy");
  }
}
複製代碼

用Groovy重構一遍以下:

for(i in 0..2) {
  print 'ho '
}
print 'Merry Groovy'
複製代碼

看看兩種語言的信噪比對比,真是給人不可估量的感動!

安全導航操做符 ?.

能夠避免代碼中的大量null引用的判斷

def foo( str ) {
  str?.reverse()  // 僅當str不爲null時reverse纔會執行
}
複製代碼

這能夠幫咱們省多少個if啊!!!


異常處理

與Java相比,Groovy的異常處理少了不少繁文縟節

對於那些不想處理或者不適合在代碼當前層次處理的異常,Groovy對用戶不作任何要求,任何用戶未處理的異常會自動傳遞到高一層,咱們啥也不用寫:

def openfile( fileName ) {  // 無需throws
  new FileInputStream( fileName ) // 無需try...catch... 處理
}
複製代碼

異常能夠放到其調用代碼中處理:

try {
  openFile("nonexistfile")
} catch( FileNotFoundException ex ) {
  print "Oops: " + ex
}
複製代碼

若捕獲全部異常(Exception),則上面catch中異常的類型均可省略:

try {
  openFile("nonexistfile")
} catch( ex ) {  // 省略類型表示可捕獲全部異常
  print "Oops: " + ex
}
複製代碼

鏈式調用

靜態方法內可以使用this來引用Class對象,所以能夠鏈式調用

class Wizard {
  def static learn( trick, action ) {
    //...
    this
  }
}

Wizard.learn('xxxx', {...})
  .learn('yyyy', {...})
  .learn('zzzz', {...})
複製代碼

後記

做者更多的SpringBt實踐文章在此:


若是有興趣,也能夠抽點時間看看做者一些關於容器化、微服務化方面的文章:


CodeSheep · 程序羊
相關文章
相關標籤/搜索