gradle-groovy脚本

gradle -groovy脚本

    Groovy注释标记和Java一样,支持//或者/**/
    Groovy语句可以不用分号结尾。Groovy为了尽量减少代码的输入,确实煞费苦心
    Groovy中支持动态类型,即定义变量的时候可以不指定其类型。Groovy中,变量定义可以使用关键字def。注意,虽然def不是必须的,但是为了代码清晰,建议还是使用def关键字
    字符串类型中双引号""的内容则和脚本语言的处理有点像,如果字符中有$号的话,则它会$表达式先求值。

Groovy中的容器类很简单,就三种:

    List:链表,其底层对应Java中的List接口,一般用ArrayList作为真正的实现类。
    Map:键-值表,其底层对应Java中的LinkedHashMap。
    Range:范围,它其实是List的一种拓展。

def aList = [5,'string',true] //List由[]定义,其元素可以是任何对象
def aMap = ['key1':'value1','key2':true] 
def aRange = 1..5  <==Range类型的变量 由begin值+两个点+end值表示

闭包,英文叫Closure,是Groovy中非常重要的一个数据类型或者说一种概念了。闭包的历史来源,种种好处我就不说了。我们直接看怎么使用它!

def aClosure = {    //闭包是一段代码,所以需要用花括号括起来..  
    String param1, int param2 ->    //这个箭头很关键。箭头前面是参数定义,箭头后面是代码  
    println"this is code"   //这是代码,最后一句是返回值,  
   //也可以使用return,和Groovy中普通函数一样  
}

Closure使用中的注意点

1.  省略圆括号
闭包在Groovy中大量使用,比如很多类都定义了一些函数,这些函数最后一个参数都是一个闭包。比如:
    public static <T> List<T> each(List<T> self, Closure closure)

上面这个函数表示针对List的每一个元素都会调用closure做一些处理。这里的closure,就有点回调函数的感觉。但是,在使用这个each函数的时候,我们传递一个怎样的Closure进去呢?比如:

    def iamList = [1,2,3,4,5]  //定义一个List
    iamList.each{  //调用它的each,这段代码的格式看不懂了吧?each是个函数,圆括号去哪了?
          println it
    }


上面代码有两个知识点:

each函数调用的圆括号不见了!原来,Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。比如
    def  testClosure(int a1,String b1, Closure closure){
          //do something
          closure() //调用闭包
    }
那么调用的时候,就可以这么调用

    testClosure (4, "test", {
       println "i am in closure"
    } )  //括号可以不写..
即如下调用

    testClosure 4,'test' ,{println "i am in closure ..."}


2.  如何确定Closure的参数

    def iamList = [1,2,3,4,5]  //定义一个List变量
    iamList.each{  //调用它的each函数,只要传入一个Closure就可以了。
      println it
    }
查看List的Api可以了解到:each函数说明中,将给指定的closure传递Set中的每一个item。所以,closure的参数只有一个。

文件IO操作
整体说来,Groovy的I/O操作是在原有Java I/O操作上进行了更为简单方便的封装,并且使用Closure来简化代码编写。

例如 File类 http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html

    def targetFile = new File("fileName")  <==File对象还是要创建的。

eachLine的唯一参数是一个Closure。Closure的参数是文件每一行的内容,其内部实现肯定是Groovy打开这个文件,然后读取文件的一行,然后调用Closure。

    targetFile.eachLine{   
      String oneLine ->  
       printl noneLine      
      }

2 直接得到文件内容

    targetFile.getBytes()  <==文件内容一次性读出,返回类型为byte[]  
 注意前面提到的getter和setter函数,这里可以直接使用targetFile.bytes   

3 使用InputStream.InputStream的SDK在 http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/InputStream.html

    def ism =  targetFile.newInputStream()  
    //操作ism,最后记得关掉  
    ism.close  

4 使用闭包操作inputStream,以后在Gradle里会常看到这种搞法

     targetFile.withInputStream{ ism ->
       操作ism. 不用close。Groovy会自动替你close
    }

5 写文件

    def srcFile = new File("srcFile")
    def targetFile = new File("targetFile")  

    targetFile.withOutputStream{ os->  
      srcFile.withInputStream{ ins->  
          os << ins   //利用OutputStream的<<操作符重载,完成从inputstream到OutputStream  
           //的输出  
       }  
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值