您的位置:首页 > 编程语言 > Lua

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

2012-02-25 19:51 316 查看
最近学习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>() {

@Override
public Object process(String t) {
System.out.println(t);
return t;
}
});

}
}
//输出如下,调用者无需遍历Iterator,只需实现业务处理器即可

Test0
Test1
Test2
Test3
Test4
Test5
Test6
Test7
Test8
Test9

典型地,在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>() {

@Override
public 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息