jdk1.5之二 —— for/in

C#想哗众取宠一下,弄了个foreach(int i in ints)恶心了本分的程序员们一把。java觉得恶心得还不够,于是更加简单的说for(int i : ints),可是取名字犯了难,最后竟然忘了人家c#已经把in用作了关键字,抓过来表示那个colon,这才诞生了“伟大”的 for/in

——FantasyDog

int[] array = new int[10];

for(int i : array)

     i = 0;

与foreach何其相像,更相像的是也在简化编程的表象下把迭代的算法抛给了客户:

array这个东西必须implements Iterable:

public interface Iterable<E> {
     java.util.Iterator<E> iterator(  );
}

而这个Iterator又是这个东西:

public interface Iterator<E> {
     boolean hasNext(  );
     E next(  );
     void remove(  );
}

使用for/in的局限性:

1. 你无法获取要迭代的Iterable的Iterator(它帮你用了)

2.所以你就没法用Iterator的那个remove方法了(接口是要你必须提供相应的方法,不过没保证你提供了我就一定会用,看,for/in 很好的诠释了接口可以实现累死笨小子的功能),又所以你如果只是要实现一个Iterator来达成使用for/in的目的,这个remove直接写成{}就可以了

3.你不能向回迭代(嗯嗯,废话)

4.你没法像常规的for那样使用次序数i,比如像array[i] = i就没法写,必须弄成:

    int times = 0;

    for(int i :array)

          i = times++;

    (恶心不死你丫的)

     这还不是最关键的,最关键的是如果你遇到这种情况:

      for(int i=0;i<length;i++){

            arrayA[i] = i;

            arrayB[i] = i;

      }

      咋整?写两个for/in吧笨大小子们(当然,如果你们坚持这种“优雅”的写法的话)

5. for/in和List这些东西整合得倒是很好,只是你在循环里就没法选择用List的get(index i)函数而不用Iterator了(等于是强制使用Iterator)

     竞争绝大部分时候当然是好事,但是有时候也确实会弄出点不伦不类的玩意来~

for/in在我看来很累赘,但是java却有个“安全”的理由来使用它:你用for/in的时候,永远不会错误的访问到集合不拥有的元素。当然,安全和便捷性往往是对立的,就如同java的安全指针:引用,和c的指针一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值