foreach语法

1.foreach用于数组:

Java SE5 引入了一种新的更加简洁的for语法用于数组和容器,,即foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项。

例如,假设有一个float数组,我们要选取该数组中的每一个元素:

 

public class ForEachFloat {
	public static void main(String[] args) {
		int[] a=new int[10];
		for(int i=0;i<10;i++){
			a[i]=i;
		}
		for(int i:a)
			System.out.println(i);		
	}
}

2.foreach用用于任何Iterable对象

到目前为止,foreach主要用于数组,但是它也可以用于任何Collection对象。你实际上看到的很多使用ArrayList时用到的是它的示例,下面是一个更通用的证明:

 

public class ForEachCollections {

	public static void main(String[] args) {
		Collection<String> cs=new ArrayList<String>();
		Collections.addAll(cs, "nihao zhongguo welcome".split(" "));
		for(String s:cs)
			System.out.println(s);
	}
}

由于cs是一个Collectio,所以这段代码展示了能够与foreach义气工作是所有的Collection对象的特性。至所以能够工作,是因为Java SE5引入了新的被称为Iterable的接口,该接口包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动,因此如果你创建了产生任何Iterable的类,都将可以将他用于foreach与剧中:

 

public class IterableClass implements Iterable<String>{
	private String[] s="welcome to china".split(" ");
	@Override
	public Iterator iterator() {
		// TODO Auto-generated method stub
		return new Iterator(){
			int count=0;
			@Override
			public boolean hasNext() {
				// TODO Auto-generated method stub
				return count<s.length;
			}
			@Override
			public Object next() {
				// TODO Auto-generated method stub
				return s[count++];
			}
			@Override
			public void remove() {
				// TODO Auto-generated method stub
				throw new UnsupportedOperationException();
			}	
		};
	}
	public static void main(String[] args) {
		for(String s:new IterableClass())
			System.out.println(s);
	}
}

Iterator()方法返回的是实现了Iterator<String>的匿名内部类的实例,该匿名内部类可以遍历数组中的所有单词,在main()中,你可以看到IterableClass确实可以用于foreach语句中。

java SE5中大量的类都是Iterable类型,主要包括所有的Collection类(但是不包括各种MAP).例如,下面的代码可以显示所有的操作系统环境变量:

public class EnvironmentVariables {
	public static void main(String[] args) {
		for(Map.Entry entry:System.getenv().entrySet()){
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
	}
}


System.getntenv()返回一个map,entrySet()产生一个由Map.Entry元素构成的Set,并且这个Set是一个Iterable,因此他可以用于foreach循环。

Foreach语句可以用于数组和任何其他的Iterable,但是这并不意味着数组肯定是个Iterable,而任何自动包装也不会自动发生:

 

public class ArrayIsNotIterable {
	static<T> void test(Iterable<T> tb){
		for(T t:tb)
			System.out.println(tb);
	}
	public static void main(String args){
		test(Arrays.asList(1,2,3));
		String[] strings={"a","b","c"};
		//An array works in foreach ,but it's not Iterable
		//!test(strings);
		test(Arrays.asList(strings));
	}
}

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐