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

本文介绍了一种在Java中模拟闭包迭代器的方法,通过自定义迭代器类实现对集合元素的处理,无需手动遍历,简化了操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值