• Groovy 闭包_胖子的家_百度空间


    Groovy 闭包_胖子的家_百度空间

    Groovy 闭包
    2008-03-04 15:28

    闭包

    Groovy 中最令人兴奋和最强大的功能是支持闭包。闭包(Closure)类似于 Java 语言中的匿名内部类。闭包和匿名内部类都是可执行的一段代码,不过这两者之间有一些细微的不同。状态是自动传入传出闭包的。闭包可以有名字。它们可以重复使用。而且,最重要且对 Groovy 同样成立的是,闭包远比匿名内部类要灵活得多!闭包用以下方法定义:

    {[comma-separated-Arguments-list ->] statements }

    闭包用“{}”括起,“->”前面是参数,后面是处理语句。下面的例子演示了如何定义并使用一个闭包。第一个闭包演示了在字符串中使用参数的形式:${param};第二个闭包演示了多参数形式:用逗号隔离参数。

    closure = { name ->
                   println("hello ${name}") }
    closure.call("world!") 
    closure = { greeting, name -> 
                   println(greeting + name) }
    closure("hello ", "world!")

    有趣的是,闭包至少会有一个参数 “it”,它其实是参数表中的第一个参数,所以如果闭包定义中只有一个参数,可以省略不写,而使用缺省的参数“it”。对于没有参数定义的闭包,“it”的值就是 null 。

    closure = { println "hello " + it }
    closure("world!")

    例子 9 展示了闭包的强大功能。新改进的 Dog 类包括一个 train 方法,它实际上执行创建了 Dog 实例的闭包。

    class Dog{
    
    def train(action){
           action.call()
        }
    }
    sit = { println "Sit, Sit! Sit! Good dog"}
    
    myDog = new Dog()
    myDog.train(sit)  //prints Sit, Sit! Sit! Good dog
    mollie = new Dog()
    mollie.train { println "Down! DOWN!" } //prints DOWN! DOWN!
    

    在上面的例子里,我们还看到,闭包通过 call() 方法被调用。(在底层,call() 方法实现了对闭包隐含的doCall()方法的调用)。Groovy 中的大多数对象具有像 each 和 find 这样的以闭包为参数的方法。用闭包来迭代对象会产生几种令人兴奋的可能性:

    [2, 4, 6, 8, 3].find { x |
         if (x == 3){
           println x
         }
    }

    其实就是:(你也许已经发现,可以用it代替x)

    myFinder={ x |
        if(x==3)
            println x
    }
    
    [2,4,6,8,3].find(myFinder)
    

    这里我们使用了一个 Groovy-Beta3 闭包定义,只是为了让您能看懂老版本Groovy的一些例子。在新的Groovy JSR中对闭包的定义略有改动,因为 | 字符同时也是 Java 中的位操作符;Groovy JSR 建议使用 Nice (另外一种JRE语言)样式的 -> 分隔符代替它。

    这种以闭包为参数的代码在Groovy里十分普遍:

    //each
    (1..100).each{ println it}
    
    //times 
    1000.times{ println it} //values go from 0 to 9999
    
    //upto
    1.upto(1000){ println it}
    
    //step 
    1.step(1001,1){ println it} //values go from 1 to 1000;
    
  • 相关阅读:
    字符串的基本操作
    PHP & Delphi 語法
    Delphi项目构成之单元文件PAS
    Delphi项目构成之项目文件DPR
    Delphi项目的构成
    關於那我的編程歷史..
    點擊Button,在Label1顯示HelloWorld!。
    開博客了, 因為搞Delphi 開發的關於Delphi學習
    Java 基础知识(一)
    关于多线程对于全局变量的资源竞争问题
  • 原文地址:https://www.cnblogs.com/lexus/p/2650852.html
Copyright © 2020-2023  润新知