15 使用lambdas和闭包

1       使用lambdas和闭包

1.1  定义闭包

闭包是一个代码块,代替了方法或类。

groovy中的闭包基于后边的构造方式:{list of parameters-> closure body}.其中,-> 之前的值为声明的闭包参数。

如果只有一个变量的时候,可以使用固有变量 it 。

如果没有返回值被定义,则返回-> 后边的值。it 的返回值的用法,参见下例子,

package closures

 

class ClosuresTest {

 

    static main(args) {

       //返回input,使用固有的变量it

       def returnInput = {it};

       assert "test" == returnInput("test");

       //返回input,不使用固有的变量it

       def returnInput2 = {s->s};

       assert "test" == returnInput2("test");

    }

 

}

 

 

1.2  闭包中定义默认值

闭包中,也可以定义参数的默认值。

package closures

 

class ClosuresDefaultValue {

 

    static main(args) {

       def multiply = {int a,int b=10 ->

           a*b;

       };

       assert multiply(2) == 20;

       assert multiply(2,5) == 10

    }

 

}

 

1.3  例子:each方法中使用闭包

在集合中使用闭包的例子,

package closures

 

class ClosuresEach {

 

    static main(args) {

       List<Integer> list = [5,6,7,8];

       println ("====自定义变量");

       list.each {line ->

           print line+",";

       };

       println ("\r\n====固有变量");

       list.each ({

           print it+",";

       });

       println ("\r\n====计算从1到10的和");

       def total = 0;

       (1..10).each {

           total += it;

       };

       println total;

    }

 

}

 

1.4  例子:通过string的长度对list排序

package closures

 

class ClosuresSort {

 

    static main(args) {

       def List strings = "this is a long sentence".split();

       strings.sort{s1,s2 ->

           s1.size() <=> s2.size();

       };

       println strings;

    }

 

}

 

输出

[a, is, this, long, sentence]

 

1.5  使用with方法

每个groovy对象都有一个with 方法,在该方法内,允许调用多个方法或属性,并将所设置的值或执行的方法都应用到该对象中。

package closures

 

import java.util.List;

 

class WithObj {

    String property1;

    String property2;

    List<String> list = [];

    def addElement(value) {

       list << value;

    };

    def returnProperties() {

       "Property 1:$property1,Property 2:$property2";

    }

}

 

 

package closures

 

class ClosuresWithMethod {

    static main(args) {

       def sample = new WithObj();

       def result = sample.with {

           property1="Input 1";

           property2="This is cool";

           addElement("Ubuntu");

           addElement("Android");

           addElement("Linux");

           returnProperties();

       };

       println result;

       assert 3==sample.list.size();

       assert "Input 1" == sample.property1;

       assert "This is cool" == sample.property2;

       assert "Linux" == sample.list[2];

      

       def sb = new StringBuilder();

       sb.with {

           append("this ");

           append("is ");

           append("appended");

       };

       println sb;

    }

 

}

 

输出:

Property 1:Input 1,Property 2:This is cool

this is appended

 

posted @ 2016-07-29 17:33  遥远2  阅读(123)  评论(0编辑  收藏  举报