java for in 为空_Java程序低手之for-in语句

你一定急于知道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 list=new ArrayList();

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{

2 final String filename;

3 public TextFile(String filename){

4 this.filename=filename;

5 }

6 @Override

7 public Iterator iterator() {

8 //TODO Auto-generated method stub9 return new TextFileIterator();

10 }

11

12 class TextFileIterator implements Iterator{

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 stub27 return nextline!=null;

28 }

29

30 @Override

31 public String next() {

32 //TODO Auto-generated method stub33 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 stub49 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是一种很好的简洁有效的写法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值