`

定制自己的增强For循环

SQL 
阅读更多
前言 写道
for/in循环就是JDK5.0中所谓的增强For循环,它能对数组和集合进行遍历,使用它会使用你的代码短小而精炼的多。这里将介绍以下内容:
  • 传统的for循环和增强for循环的比较
  • 定制自己的增强for循环
  • 增强for循环的局限性


一:传统的for循环和增强for循环的比较
//传统的数组遍历
		String[] persons={"张三","李四","王五"};
		for(int i=0;i<persons.length;i++){
			System.out.println(persons[i]);
		}
//使用增强for循环的数组遍历
		String[] persons={"张三","李四","王五"};
		for(String person:persons){
			System.out.println(person);
		
//传统的Iterator遍历集合
		List<String> persons=new ArrayList<String>();
		persons.add("张三");
		persons.add("李四");
		persons.add("王五");
		for(Iterator<String> i=persons.iterator();i.hasNext();){
			String person=i.next();
			System.out.println(person);
		}
//使用增强For循环遍历集合
		List<String> persons=new ArrayList<String>();
		persons.add("张三");
		persons.add("李四");
		persons.add("王五");
		for(String person:persons){
			System.out.println(person);
		}

可以看到使用增强for循环使得代码变得短小而精炼的多,如果你觉得这点变化还体现不出来,可以忍受,那你可以试试嵌套for循环,就会感觉到增强for循环的好处了,这里就不贴代码了。
二:定制自己的增强for循环
众所周知,增强for循环是按数组或者集合的内在顺序输出的,如果我们想在遍历的时候定制行为怎么做呢?下面就以一个逆序输出的例子说明怎么定制自己的增强for循环。
要想使用增强for循环,必须实现Iterable接口。
import java.util.Iterator;

/**
 * 一个简单的逆序输出增强for循环
 * @author 飞雪无情
 *
 */
public class ReverIterableClass<T> implements Iterable<T> {
	protected T[] elements;
	public ReverIterableClass(T... elems) {
		this.elements=elems;
		//this.object=(T[])new Object[ts.length];
	}
	public Iterator<T> iterator() {
		return new Iterator<T>(){
			private int current=elements.length-1;
			public boolean hasNext() {
				return current>-1;
			}

			public T next() {
				return elements[current--];
			}

			public void remove() {
				throw new UnsupportedOperationException("目前不支持删除操作");
			}
		};
	}
	public static void main(String[] args){
		ReverIterableClass<String> iterableClass=new ReverIterableClass<String>("a","b","c","d");
		for(String s:iterableClass){
			System.out.println(s);
		}
	}

}

在这个程序里我们定制了自己的输出行为--逆序输出,当然你也可以定义属于你自己的,只需要在next()函数里写处理代码即可。
三:增强for循环的局限性
不能在增强for循环中访问位置,例如下面的代码:
String[] persons={"张三","李四","王五"};
		for(int i=0;i<persons.length;i++){
			System.out.println(i+":"+persons[i]);
		}

在增强for循环中你是得不到这个位置"i"的。
例如还有我们常用的在组合sql语句,select字段的时候,当是最后一个字段时,不能加","的。
String[] fields={"name","age","sex"};
		StringBuilder sql=new StringBuilder("select ");
		for(int i=0;i<fields.length;i++){
			if(i<fields.length-1){
				sql.append(fields[i]+",");
			}else{
				sql.append(fields[i]);
			}
		}
		sql.append(" from t_user");
		System.out.println(sql);

这在增强for循环中也是不能处理的。。
还有对元素的删除,在增强for循环中也不能做到,但是使用传统的Iterator接口遍历时就可以使用他的remove()方法删除符合条件的元素。
四:小结
增强for循环有它的好处,比如简洁,代码优雅,如果能使用增强for循环,一定要优先使用。
2
1
分享到:
评论

相关推荐

    Java循环跳转语句之continue共2页.pdf.zi

    4. **增强for循环(foreach)**:增强for循环适用于遍历数组或集合。尽管在这种循环中使用`continue`可能不如其他类型常见,但它仍然有效,会跳过当前迭代的剩余部分,然后继续处理数组或集合中的下一个元素。 在...

    How to Use for-Loops to Visualize Data in MATLAB.zip

    总结起来,MATLAB的for循环是数据分析和可视化的强大工具,它允许我们系统地遍历和处理数据,同时生成定制化的视觉表示。通过熟练掌握for循环的使用,我们可以更加高效地探索和解释数据,为研究或工程问题提供有价值...

    AutoCode-for-VB6.0.rar_AutoCode for VB6_AutoCode_VB6.0_autocode

    总之,AutoCode for VB6.0是一个针对VB6开发环境量身定制的增强工具,它的出现使得在VB6平台上进行开发变得更加高效和舒适。对于那些仍然坚守在VB6阵地的开发者来说,AutoCode无疑是一个不可多得的利器。

    ios-自定义自动循环滚动.zip

    通过注册Cell类和使用`dequeueReusableCell(withReuseIdentifier:for:)`方法,可以有效地重用已创建的Cell。同时,考虑异步加载图片,防止阻塞主线程。 总之,“ios-自定义自动循环滚动.zip”中的示例项目提供了一...

    vba-for-wps-来了,vba插件控件-供大家学习研究参考

    4. 用户界面定制:使用VBA创建自定义工具栏、菜单和快捷键,增强用户交互体验。 5. 文件操作:读写文件、导入导出数据,实现跨文档操作。 6. 数据处理:使用VBA处理和分析数据,例如排序、过滤、计算等。 7. 错误...

    一组简洁精致的循环结构PPT图表素材.rar

    循环分为两种主要类型:一是"for"循环,适用于已知迭代次数的情况;二是"while"循环,适用于未知或无限循环的情况。此外,还有"do-while"循环,它至少会执行一次循环体,然后根据条件判断是否继续执行。在PPT中,...

    Rizom Bridge for Maya

    7. **定制化工作流程**:Rizom Bridge允许用户根据自己的需求定制工作流程,通过自定义快捷键和设置,适应个人的工作习惯,提高工作效率。 8. **学习资源**:为了帮助用户更好地掌握这款工具,通常会提供详尽的文档...

    电子功用-可编程集成电路中嵌入循环、递归控制模块

    在PIC微控制器中,可以利用指令集中的循环指令(如FOR、WHILE、DO-WHILE等)实现循环控制。 2. 优点:循环控制能够高效处理重复任务,节省内存和执行时间,比如在实时系统中进行数据采集或定时任务。 3. 设计与...

    TMS Pack for FireMonkey 3.3.2.2 Full Source

    总的来说,TMS Pack for FireMonkey 3.3.2.2 Full Source是一个为Delphi开发者量身定制的强大工具,通过提供丰富的组件和源代码,极大地提升了开发效率和灵活性。无论是在数据管理、用户界面设计还是在跨平台应用...

    a10_android内容定制说明文档

    `p` 为标识符,第二个数字表示循环次数(`1` 表示仅播放一次,`0` 表示无限循环),第三个数字表示两次循环间的间隔帧数,最后一个字段为图片所在的目录名称。 - **打包**: - **Windows**:使用 WinRAR 打包并选择...

    VBA for WPS 2016/2019

    - **基础语法**:了解变量、常量、控制结构(如if-else,for循环)以及函数的用法。 - **对象模型**:理解WPS Office的对象模型,如工作簿、工作表、形状等,以及它们之间的关系。 - **调试技巧**:学会使用断点...

    [插件资源] Dialogue System for Unity 1.7.0 - 创建对话系统的专用插件

    Dialogue System for Unity是一款高度可定制的对话管理工具,适用于各种类型的游戏。它提供了一个直观的图形界面,使开发者能够轻松创建、编辑和管理角色之间的对话。1.7.0版本进一步优化了用户体验,修复了已知问题...

    公告在贴内显示 for phpwind.rar

    【标题】"公告在贴内显示 for phpwind.rar" 是一个专门为PHPWind论坛系统设计的插件,旨在增强论坛的功能性和用户体验。PHPWind是一款流行的开源社区建站软件,广泛应用于搭建论坛、问答、博客等互动平台。这个插件...

    java-repl,Java的EVE打印循环.zip

    Java REPL(Read-Eval-Print Loop)是一种交互式编程环境,允许程序员在运行时测试代码片段,查看结果并立即修改代码。...此外,对于那些想要改进或定制自己Java开发环境的人来说,研究这个项目也是一个不错的起点。

    单片机控制左右来回循环的流水灯.pdf

    6. **延迟函数**:`delay()`函数是程序中实现灯光间隔的关键,它通过两个嵌套的for循环来消耗CPU时间,达到延迟的效果。这里的延迟时间由`i`和`j`的循环次数决定。 7. **硬件电路**:电路设计包括单片机、8个LED、...

    Convolutional neural networks for matlab

    这意味着用户可以根据自己的需求选择合适的组件来搭建定制化的网络结构。这种灵活性为研究者提供了极大的自由度,同时也降低了开发新模型的技术门槛。 #### 计算模块 MatConvNet中包含了多种基本的计算模块,这些...

    Microsoft Access VBA Programming for the Absolute Beginner

    VBA是Microsoft Office套件中广泛使用的编程语言,特别适用于自动化办公任务、创建定制化应用程序或增强现有软件的功能。本书首先介绍了VBA的基本概念,包括变量、数据类型、流程控制结构(如循环和条件语句)、函数...

    excel Visual Basic forApplication(1)

    2. **逻辑处理**:宏录制器无法处理复杂的条件逻辑或循环结构,需要手动编写代码来实现这些功能。 3. **错误处理**:录制的宏通常缺乏错误处理机制,当出现异常情况时可能会导致程序崩溃。 4. **性能问题**:过度...

    09lv试卷答案

    2. 累加值变化及结构:程序使用了条件结构和for循环,累加值在for循环内部递增,当达到16时,条件结构控制指示灯的状态,前14次累加值增加时灯亮,第15次灯灭。 3. 三角符号解析:在程序中,三角符号代表移位寄存器...

Global site tag (gtag.js) - Google Analytics