java用回调模拟Lua的闭包功能

来源:互联网 发布:php require 语言结构 编辑:程序博客网 时间:2024/06/06 03:39

最近学习Lua,在书中看到Lua的table迭代器是用闭包实现的,在java7以前的SDK并不提供闭包功能,java的List的Iterator其实并没有实现迭代的功能,实际只提供了迭代生成器

,调用者需要通过for循环或者while循环,遍历 Iterator,笔者参照Lua的闭包Iterat功能,用回调模拟了闭包功能,实现了真正的迭代器,调用者不用再遍历Itertator,即可实现功能,闭包知识参见闭包_维基百科

代码如下:

package com.czp;import java.util.Iterator;/*** *  * Really Iterator *  * @author CaoZhongping *  */public class RIterartor<T> {private Iterable<T> iter;public RIterartor(Iterable<T> iter) {super();this.iter = iter;}/** *  * @param processor */public void process(Processor<T> processor) {for (Iterator<T> it = iter.iterator(); it.hasNext();) {processor.process(it.next());}}/** *  * @author CaoZhongping *  */public interface Processor<T> {Object process(T t);}}//测试代码:package com.czp.test;import java.util.ArrayList;import java.util.List;import com.czp.RIterartor;import com.czp.RIterartor.Processor;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<String>();for (int i = 0; i < 10; i++) {list.add("Test" + i);}RIterartor<String> iter = new RIterartor<String>(list);iter.process(new Processor<String>() {@Overridepublic Object process(String t) {System.out.println(t);return t;}});}}//输出如下,调用者无需遍历Iterator,只需实现业务处理器即可Test0Test1Test2Test3Test4Test5Test6Test7Test8Test9

典型地,在jsp显示查询的结果时,只需这样简单的调用即可生成Html:

package com.czp.test;import java.util.ArrayList;import java.util.List;import com.czp.RIterartor;import com.czp.RIterartor.Processor;public class Test {public static void main(String[] args) {List<String> list = new ArrayList<String>();for (int i = 0; i < 10; i++) {list.add("name" + i);}final StringBuilder sb = new StringBuilder();sb.append("<html>\n\t<head>\n\t\t<title>Test</title></head>\n\t<body>\n\t<table>\n\t<tr>\n");RIterartor<String> iter = new RIterartor<String>(list);iter.process(new Processor<String>() {@Overridepublic Object process(String t) {sb.append("\t\t<td>").append(t).append("</td>\n");return t;}});sb.append("\t</tr>\n\t</table>\n\t<body>\n</html>");System.out.println(sb);}}

//输出如下:

<html><head><title>Test</title></head><body><table><tr><td>name0</td><td>name1</td><td>name2</td><td>name3</td><td>name4</td><td>name5</td><td>name6</td><td>name7</td><td>name8</td><td>name9</td></tr></table><body></html>