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的指针一样。