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 阅读(376) 
评论(0)  编辑  收藏  所属分类: 
Java