Vincent

Vicent's blog
随笔 - 74, 文章 - 0, 评论 - 5, 引用 - 0
数据加载中……

For-Each 循环

管中窥虎

在学习 java 1.5 的过程中,我使用了 sun 公布的 tutorial ,这份文档写的比较详尽易明,但是对于想快速了解 tiger 而且具有较好 java 基础的人来说,大篇幅的英文文档是比较耗时间和非必需的,所以我将会归纳这份文档的主要内容,在保证理解的底线上,尽力减少阅读者需要的时间。

 

在以下地址可以进入各新增语言特色介绍以及下载相关文档(若有)。

http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

 

第二道虎纹: For-Each 循环

目前在一个容器里做迭代访问挺郁闷的,看看下面这个方法,方法的目的是把容器里的一系列计时任务取消。

void  cancelAll(Collection < TimerTask >  c)  {

    
for  (Iterator < TimerTask >  i  =  c.iterator(); i.hasNext(); )

        i.next().cancel();

}

关于

Iterator 的部分真的很罗嗦,而且容易出错。现在再看看 1.5 里带来的 For-each 循环:

void  cancelAll(Collection < TimerTask >  c) {

    
for  (TimerTask t : c)

        t.cancel();

}

这个新的循环和泛型完美配合,既保持类型安全,又去掉了冗余。

以下是一个在试图嵌套迭代的时候经常会犯的错误。

List suits  =  ;

List ranks 
=  ;

List sortedDeck 
=   new  ArrayList();

 

//  BROKEN - throws NoSuchElementException!

for  (Iterator i  =  suits.iterator(); i.hasNext(); )

    
for  (Iterator j  =  ranks.iterator(); j.hasNext(); )

        sortedDeck.add(
new  Card(i.next(), j.next()));

 

原因是 i.next() 被过多的调用了。

再看看新循环的表现,简直是度身定造一样的般配。

for  (Suit suit : suits)

    
for  (Rank rank : ranks)

        sortedDeck.add(
new  Card(suit, rank));

 

for-each 循环也适用于数组,象隐藏迭代子一样,这次它把数组下标藏起来了。

//  Returns the sum of the elements of a

int  sum( int [] a)  {

    
int  result  =   0 ;

    
for  ( int  i : a)

        result 
+=  i;

    
return  result;

}

 

那么我们什么时候该用 for-each 循环呢?只要情况运行就应该用,它真的让你的代码好看了很多。不幸的是,它有不能发挥作用的情形,就是需要用 iterator remove 方法的时候,因为 iterator 被隐藏了,你也无法调用它的方法了,新的循环不适用于过滤元素。同样的也不适用于需要把数组中的元素替换掉的情况。最后,它也不能在平行遍历多个容器的情况里使用,这些缺点,设计者是知道的,但是最后他们明智地选择这样一个简单的,能适用于多数情况的设计方案

posted on 2006-08-22 11:20 Binary 阅读(181) 评论(0)  编辑  收藏 所属分类: j2se


只有注册用户登录后才能发表评论。


网站导航: