Java程序低手之for-in语句

java

你一定急于知道for-in与本来的for语句有什么区别,那么你一定知道原来的for语句怎么写了,来看下面一段代码,它将给你解释for-in语句的一般结构:

1 int[] primes=new int[]{2,3,5,7,11,13,17,19,23,29};
2 for(int n:primes)System.out.println(n);//这里使用了for-in语句,句法规则如语句所示

就是这么简单,到这里已经讲完了基本的for-in语句,但是我想你还是应该知道后面的一些东西。

一般来说,for-in中的array或者collection不能通过循环变量来修改。

避免for-in语句中的类型转换

有时候你需要使用?List来处理一些类,而在for-in语句中可能需要使用它,那么就需要使用强制类型转换,如下代码:

1 List list=new ArrayList();
2 list.add(new Integer(1));
3 list.add(new Integer(2));
4 for(Object s:list){
5 System.out.println((Integer)s+5);
6 }

上面的例子如果写成下面这样就可以避免强制类型转换,而且我们也赞成写成如下这样,可以在源头上控制输入,这也是泛型的使用:

1 List<Integer> list=new ArrayList<Integer>();
2 list.add(new Integer(1));
3 list.add(new Integer(2));
4 for(Integer s:list){
5 System.out.println(s+5);
6 }

让你的class可以用于for-in语句

有以上你看到的可以看出来,所有的可使用for-in的collection和Array的这些类中有一个共同的特征,他们实现了Iterator或者Iterable这两个接口。

所以如果你想写一个class,使得它可以再for-in中使用,那么,有两种方式可选:

第一种,扩展collection class

第二种,实现Iterable接口,下面是一个实现Iterable的例子:

 1 public class TextFile implements Iterable<String>{
2 final String filename;
3 public TextFile(String filename){
4 this.filename=filename;
5 }
6 @Override
7 public Iterator<String> iterator() {
8 // TODO Auto-generated method stub
9 return new TextFileIterator();
10 }
11
12 class TextFileIterator implements Iterator<String>{
13 BufferedReader in;
14 String nextline;
15 public TextFileIterator(){
16 try{
17 in=new BufferedReader(new FileReader(filename));
18 nextline=in.readLine();
19 }catch(IOException e){
20 throw new IllegalArgumentException(e);
21 }
22 }
23
24 @Override
25 public boolean hasNext() {
26 // TODO Auto-generated method stub
27 return nextline!=null;
28 }
29
30 @Override
31 public String next() {
32 // TODO Auto-generated method stub
33 try{
34 String result=nextline;
35 if(nextline!=null){
36 nextline=in.readLine();
37 if(nextline==null)
38 in.close();
39 }
40 return result;
41 }catch(IOException e){
42 throw new IllegalArgumentException(e);
43 }
44 }
45
46 @Override
47 public void remove() {
48 // TODO Auto-generated method stub
49 throw new UnsupportedOperationException();
50 }
51 }
52
53 public static void main(String[] args){
54 String filename="test.txt";
55 if(args.length>0)
56 filename=args[0];
57 for(String line:new TextFile(filename))
58 System.out.println(line);
59 }
60 }

这是一个用于读取文件每行并且打印出来的例子。

判别list的位置与变量值

某种程度上来说,for-in带来的方便性,使得编程也失去了一些弹性。

你的代码在for-in语句中执行的时候,是没有办法访问它在list中的位置的,而且list变量本身也无法被访问。

事实上for-in还有很多事情无法做到:

A.移除for-in循环中的list项目

B.反向iterate array或List的元素

C.使用单一的循环计数器来存取有相同数目的或位置的两个不同的array或者collection中的元素

...

等等,但是总的来说,对于遍历,for-in是一种很好的简洁有效的写法。

以上是 Java程序低手之for-in语句 的全部内容, 来源链接: utcz.com/z/393797.html

回到顶部