foreach语法

来源:互联网 发布:装修空气检测 知乎 编辑:程序博客网 时间:2024/05/12 20:19

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(" ");@Overridepublic Iterator iterator() {// TODO Auto-generated method stubreturn new Iterator(){int count=0;@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn count<s.length;}@Overridepublic Object next() {// TODO Auto-generated method stubreturn s[count++];}@Overridepublic void remove() {// TODO Auto-generated method stubthrow 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));}}