`

[#0x001C] foreach与Iterable

    博客分类:
  • Java
 
阅读更多

  Iterable是一个接口,它只有一个方法iterator(),要求返回一个Iterator。

package java.lang;

public interface Iterable<T>
{
	Iterator<T> iterator();
}

 

  而Iterator本身也是个接口,它有hasNext()、next()、remove三个方法。

package java.util;

public interface Iterator<T>
{
	boolean	hasNext();
	T		next();
	void	remove(); //optional
}

  

  一般的实现为:

import java.util.*;

public class StringArray implements Iterable<String>
{
	private String[] words;
	
	public StringArray()
	{
		words = "This is the default sentence".split(" ");
	}
	
	public StringArray(String sentence)
	{
		words = sentence.split(" ");
	}
	
	public Iterator<String> iterator()
	{
		return new Iterator<String>()
		{
			private int index = 0;
			
			public boolean hasNext()
			{
				return index <= words.length - 1;
			}
			
			public String next()
			{
				return words[index++];
			}
			
			public void remove()
			{
				//we do not implement it here
				throw new UnsupportedOperationException();
			}
		};
	}
	
	public static void main(String[] args)
	{
		StringArray sa = new StringArray("Hello World");
		
		for (String s : sa)
			System.out.println(s);
	}
}
	
//output:
/*	
	Hello	
	World
*/

  

  目前有这么一个问题,如果一个类想要有不同的Iterator怎么办?实现Iterable接口是只能产生一个Iterator的。我们很容易地想到可以使用多个方法来返回不同的Iterator (或者Iterable),而不是去实现Iterable接口。不过这么一来还可以使用foreach语句么?还是可以的,如下:

import java.util.*;

public class ReverseStringArray
{
	private String[] words;
	
	public ReverseStringArray()
	{
		words = "This is the default sentence".split(" ");
	}
	
	public ReverseStringArray(String sentence)
	{
		words = sentence.split(" ");
	}
	
	public Iterable<String> reverseIterable()
	{
		return new Iterable<String>()
		{
			public Iterator<String> iterator()
			{
				return new Iterator<String>()
				{
					private int index = words.length - 1;
				
					public boolean hasNext()
					{
						return index >= 0;
					}
				
					public String next()
					{
						return words[index--];
					}
					
					public void remove()
					{
						//we do not implement it here
						throw new UnsupportedOperationException();
					}
				};
			}
		};
	}
	
	public static void main(String[] args)
	{
		ReverseStringArray rsa = new ReverseStringArray("Hello World");
		
		for (String s : rsa.reverseIterable())
			System.out.println(s);
	}
}

//output:
/*
	World
	Hello
*/

  由此可见,foreach语句接收的只是Iterable接口,所以,只要类可以提供一个Iterable接口,那么它就能被foreach处理。对实现了Iterable的类而言,可以理解为是一个向上转型(upcast),即for (String s : sa)其实是for (String s : (Iterable)sa);对没有实现Iterable的类而言,需要显式提供一个Iterable给foreach语句,如for (String s : rsa.ReverseIterable())。

分享到:
评论

相关推荐

    ForEach_java(cusTag).txt

    根据提供的文件信息,本文将详细解释“ForEach_java(cusTag).txt”中涉及的关键知识点,主要包括自定义 JSP 标签库中的 `ForEach` 标签实现及其在 Java Web 应用程序中的应用。 ### 一、ForEach 标签概述 `ForEach...

    C-FOREACH用法

    `C-FOREACH`是JavaServer Pages (JSP)中JSTL (JavaServer Pages Standard Tag Library)的一部分,用于在页面上进行循环遍历。它提供了便利的方式来迭代数组、集合、Map或者其他迭代对象中的元素。在JSP开发中,`C-...

    c:forEach标签的使用祥解

    在JavaServer Pages (JSP) 开发中,`c:forEach`标签是Java Expression Language (EL) 和 JavaServer Pages Standard Tag Library (JSTL) 的一部分,它提供了一个方便的方式来迭代数组、集合、Map或其他可迭代的数据...

    c:foreach的各种用法

    ### c:foreach 的各种用法详解 在JSP(JavaServer Pages)开发中,`&lt;c:forEach&gt;` 是一个非常重要的标签,它属于JSTL(JavaServer Pages Standard Tag Library)的一部分,主要用于循环处理集合、数组等数据结构。相...

    c#中Foreach详细用法

    在本文中,我们将详细介绍Foreach语句的用法和优点,并与传统的for循环语句进行比较。 一、Foreach语句的基本用法 -------------------------------- Foreach语句的基本语法结构为: ```csharp foreach (变量类型 ...

    PHP PDO操作总结

    foreach ($foods-&gt;fetchAll() as $food) { echo $food['name'] . ' '; } // 或者 $first_food = $foods-&gt;fetch(); ``` ### 0x06 转义用户输入 PDO的`quote()`方法用于转义用户输入,防止SQL注入: ```php $...

    深入理解C#中foreach遍历的使用方法

    C#中的`foreach`遍历是编程中常用的操作,它简化了对集合、数组和列表等数据结构的迭代。在C#中,`foreach`循环主要用于遍历实现了`IEnumerable`接口的对象,包括数组、列表(`List&lt;T&gt;`)、字典(`Dictionary, ...

    Java源码分析Iterable.pdf

    Java源码分析Iterable是Java编程语言中一个基础组件的源码分析,Iterable是一个接口,它允许对象被迭代,例如foreach循环中的数组或集合。了解Iterable的源码,可以帮助开发者更好地理解Java编程语言的实现机制。 ...

    foreach用法参考文档

    7. **`foreach`与引用**:通过在`as`关键字后面加上`&`,可以将`$value`作为引用赋值,这样可以改变原始数组的值。 了解了这些`foreach`的使用技巧后,你就可以更加灵活地处理数组和对象了。在实际编程中,`foreach...

    【JavaScript源代码】Nodejs 数组的队列以及forEach的应用详解.docx

    ### 数组与`forEach` `forEach`是用于遍历数组的常用方法。它接受一个回调函数作为参数,该函数会在数组的每个元素上执行一次。回调函数有三个参数:当前元素值、元素索引和整个数组。但是,`forEach`不支持中断...

    <c:forEach>/jstl-1.2

    &lt;c:forEach&gt; 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行&lt;c:forEach&gt;的本体内容。 语法 语法1:迭代一集合对象之所有成员 &lt;c:forEach [var="varName...

    Javascript数组循环遍历之forEach详解

    总结而言,`forEach`提供了一种简洁有效的方式来遍历数组,虽然它的兼容性与控制流跳转不如传统的`for`循环灵活,但在现代JavaScript开发中,它是处理数组元素遍历的首选方法。对于不支持`forEach`的老旧浏览器,...

    foreach、while、for性能比较

    ### foreach、while、for性能比较 在编程领域中,循环结构是实现重复操作的基本手段之一。根据不同的场景和需求,开发者可以选择使用`foreach`、`while`或`for`等不同类型的循环。本文将深入探讨这三种循环在PHP中...

    C#并发实战记录之Parallel.ForEach使用

    C#并发实战记录之Parallel.ForEach使用 本篇文章主要介绍了C#并发实战记录之Parallel.ForEach使用的相关知识点。通过示例代码,详细介绍了Parallel.ForEach的使用方法和优化技巧。 一、使用Parallel.ForEach优化...

    javascript forEach函数实现代码

    从给定的文件信息中,我们可以提炼出与JavaScript中的forEach函数相关的一系列知识点。下面是详细分析: ### forEach函数基础 `forEach` 是 JavaScript 中数组的一个方法,它为数组中的每个元素执行一次提供的函数...

    PHP foreach循环使用详解与实例代码

    foreach循环在处理数组时非常方便,特别是当你需要对数组中的每个元素执行操作时。它不仅代码可读性好,而且也简化了数组元素的访问逻辑。 ### foreach的基本语法 foreach循环有两种使用方式,取决于你是否需要在...

    jstl标签 forEach详解

    &lt;c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]&gt; 本体内容 &lt;/c:forEach&gt; ``` ### 语法 2:迭代指定的次数 ``` &lt;c:forEach [var="var...

    使用foreach循环遍历数组的用法例子(附详细步骤).txt

    ### 使用foreach循环遍历数组的用法例子及详细步骤 #### 一、基础知识介绍 在PHP编程语言中,数组是一种非常重要的数据结构,用于存储多个值。数组可以是一维的,也可以是多维的。在处理数组时,经常需要遍历数组...

    c标签-if-foreach-jar

    在这个主题"**c标签-if-foreach-jar**"中,主要涉及到的是JSTL的两个核心标签`&lt;c:if&gt;`和`&lt;c:forEach&gt;`,它们是JSTL提供的条件判断和循环控制标签,通常与`jstl.jar`包一起使用。 首先,让我们详细了解**&lt;c:if&gt;**...

    js代码-forEach实现

    `forEach`与其他数组方法(如`map`、`filter`、`reduce`)结合使用,可以实现更复杂的数组操作。例如,可以使用`map`和`forEach`一起创建一个新数组,其中的元素是原数组元素的平方: ```javascript let squares = ...

Global site tag (gtag.js) - Google Analytics