Groovy - 基本特性

有别于java的一些方面

  • Groovy 可以省略分号和修饰符(类以及方法的修饰符)。

  • 默认情况下,Groovy 的所有内容都为 public。

  • Groovy 允许定义简单脚本,同时无需定义正规的 class 对象。比如可以通过 groovyconsole打开groovy的控制台,可以直接跑

      println "hello"
    
  • Groovy 在普通的常用 Java 对象上增加了一些独特的方法和快捷方式,使得它们更容易使用。比如对于集合的操作。

  • Groovy 语法还允许省略变量类型,具有类型推断,可以很据具体指推断出变量的类型,难以推断时也可以把变量当成Object。 无类型导致groovy不需要使用接口或者抽象类。

  • 方法的默认值:可以给方法设置默认值 eg: def addFun(a, b=4)

集合相关的操作

  • 范围也算集合:

      def range = 0..4
      range instanceof List
    
  • def listDemo = ["aa", "bb", "cc"] 其实就是一个java里面的ArrayList

  • list相关的操作:

    • 赋值操作:
      • listDemo("dd")
      • listDemo << "ee"
      • listDemo[5] = "ff"
    • 取值操作:
      • listDemo[2] == "cc"
    • 对集合元素的增减操作
      • def numbers = [1,2,3,4]
      • numbers + 5 == [1,2,3,4,5]
      • numbers - [1,2] == [3,4]
    • 便捷的转换方法:
      • numbers.join(",") == "1,2,3,4"
      • [1,2,3,4,4].count(4) == 2
  • map相关的:

    • def mapDemo = [name:"Allen", age:"18"]
    • 赋值操作:
      • mapDemo.put("id", 2015), 这种写法,key需要“”。
      • mapDemo.id = "2015" 这种写法,key不需要“”, 但是groovy会把它转化成String类型.
        *取值操作
      • 使用 . 的操作,也可以进行取值操作。eg: mapDemo.id == "2015"
      • mapDemo["name"] == "Allen" , 使用[]取值的话,key需要使用String

闭包

  • 对集合的操作

      def userList = ["allen", "mike", "jack"]
      userList.each{
      	println it
      }
      //it 默认是迭代的对象,也可以重新指定key,如下
      userList.each{user ->
      println user
      }	
      
      //当然如果是想遍历一个map的话,也类似
      def mapDemo = [name:"Allen", age:"18"]
      mapDemo.each{key, value ->
      println "${key} = ${value]"
      }
    
  • 一个闭包也是一个变量

      def sayHello = { name ->
      	return "Hello! ${name}"
      }
      //闭包的两种调用方式
      assert "Hello! Allen" == sayHello("Allen")
      assert "Hello! Allen" == sayHello("Allen").call()
    

对类的操作

  • 会自动拥有 getter/setter 方法 和构造函数

  • 属性都可以使用 def来定义,而且都是私有的, 自动拥有的方法中的参数类型是 Object类型。

  • 如果是写一个override的方法,需要显示的写明返回类型

    • 最简单的一个类的定义如下:

        class User {
        	def name
        	def age
        	def id
        }			
      
    • 直接使用构造函数

        def userInstant = new User("Allen", 18, "2015")
      
    • 赋值:

        userInstant.name = "Allen"
        userInstant.setName("Allen") 
      
    • groovy里面的方法调用支持不写括号,上面这句赋值语句可以写成:

        userInstant.setName "Allen"      //这样写,个人感觉不利于读代码
      
    • 取值:

        assert userInstant.name == "Allen"
        assert userInstant.getName() == "Allen"
      

方法返回值以及对于NPE的处理

  • groovy 里面方法的返回值如果不显示的写return语句,则最后一行语句作为返回值

      String hello(name){
      	"Hello! ${name}"
      }		
      //这个hello()方法体中并没有出现return, groovy会把 “Hello! ${name}”作为返回值,并且也可以表明这个方法的返回类型是 String
    
  • groovy对于非空的的判断,只需要简单的加一个问号 ?就可以了

      //比如在写了一个 getName() 的方法如下:
      
      def getUserUpCaseName(){
      	userInstant.name.toUpperCase()
      }
      
      //如果在调用这个方法的时候 userInstant中的name属性还没有赋值,那么显然会出现NPE的问题。
      //在groovy里面我们可以写成下面这样,就没有问题了
      
      def getUserUpCaseName(){
      	userInstant.name?.toUpperCase()
      }
    
posted @ 2015-06-24 10:47  egg_lee  阅读(1188)  评论(0编辑  收藏  举报