Jcat
宠辱不惊,闲看庭前花开花落~~
posts - 173,comments - 67,trackbacks - 0

Definition

    /*
        1. 变量是用来装“数据”的,闭包就是用来装“操作”的
        2. 和定义一个方法一样,闭包也可以有入参
       
*/
        Closure p 
=  {x  ->
            print x 
+   '   '
        }
        [
1 2 3 ].each(p)

        [
4 5 6 ].each({x  ->   //  闭包是可以匿名的
            print x  +   '   '
        })

        [
7 8 9 ].each {x  ->   //  括号是可以省略的
            print x  +   '   '
        }

        [
10 11 12 ].each {  //  it是默认的参数名字,所以这里连入参的定义都省了
            print it  +   '   '
        }


Using

package jcat.bit

class Test {
    
/*
    1. 闭包是对象,是Closure类的实例,所以:
        1)可以在类里定义Closure类型的属性
        2)可以在方法里定义Closure类型的变量
        3)可以定义一个方法,接收Closure类型的参数
    2. 闭包又有方法特质,毕竟它装的是“操作”,甚至可以像调用方法一样调用闭包
     
*/

    
static final Closure PRINT_STR = {  // 属性(类变量)
        println it
    }


    
static void main(String[] a) {
        
/*
        闭包类似Java的内部类,区别是闭包只有单一的方法可以调用,但可以有任意的参数,
        闭包用“{}”括起,“->”前面是参数,后面是处理语句,可以直接调用,也可以使
        用call调用。不管那种调用,最后groovy编译器都会把编译成对doCall方法的调用,
        这是groovy对闭包的一个隐藏方法。
         
*/
        PRINT_STR(
"像方法一样调用")
        PRINT_STR.call(
"作为Closure的实例,再调用相应的方法")


        Closure printLength 
= {String s ->  // 局部变量
            println s.length()
        }
        printLength(
"AAA")

        
/*
        通常,操作是死的,我们能动态代入的是“数据”。
        闭包使得我们可以动态的代入一段“操作”。
        “闭包是可以用作方法参数的代码块。”
         
*/
        closureAsParameter(
null, printLength)
        closureAsParameter(
"BBB", PRINT_STR)
    }

    
static void closureAsParameter(String s, Closure c) {
        
if (s != null) {
            c.call(s)
        }
    }
}



-----------------------------------------------------------------
附上一个Java的匿名内部类的例子,用来和闭包对比一下。
package jcat.bit;

public class AnonymousInnerClass {
    
public static void main(String[] args) {
        AbsClass a 
= new AbsClass() {
            
public void foo(String s) {
                System.out.println(s);
            }
        };

        a.foo(
"ABC");

        AbsClass b 
= new AbsClass() {
            
public void foo(String s) {
                System.out.println(s.length());
            }
        };
        b.foo(
"ABC");
    }
}

abstract class AbsClass {
    
public abstract void foo(String s);
}
posted on 2008-11-06 18:50 Jcat 阅读(337) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: