Day12-39.Foreach syntax

来源:互联网 发布:淘宝绽放茉莉恶心 编辑:程序博客网 时间:2024/06/13 23:31

foreach 语法

Java SE5引入了一种新的更加简洁的for语法用于数组和容器(在第16章与第17章中将更多的讨论这种语法),即foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项。

例如,假设有一个float数组,我们要选取该数组中的每一个元素:

//: control/ForEachFloat.javaimport java.util.*;public class ForEachFloat {  public static void main(String[] args) {    Random rand = new Random(47);    float f[] = new float[10];    for(int i = 0; i < 10; i++)      f[i] = rand.nextFloat();    for(float x : f)      System.out.println(x);  }} /* Output:0.727115750.399826350.53094540.05341220.160206560.577997570.188478650.41701370.516602040.73734957*///:~这个数组是用旧式的for循环组装的,因为在组装时必须按索引访问它。在下面这行中可以看到foreach语法:for(float x: f){这条语句定义了一个float类型的变量x,继而将每一个f的元素赋值给x。任何返回一个数组的方法都可以使用foreach。例如,String类有一个方法toCharArray(),它返回一个char数组,因此可以很容易地像下面这样迭代在字符串里面的所有字符://: control/ForEachString.javapublic class ForEachString {  public static void main(String[] args) {    for(char c : "An African Swallow".toCharArray() )      System.out.print(c + " ");  }} /* Output:A n   A f r i c a n   S w a l l o w*///:~



就像在第11章中所看到的,foreach还可以用于任何Iterable对象。

许多for语句都会在一个整型值序列中步进,就像下面这样:

for(int i=0 ;i<100; i++)

对于这些语句,foreach语法将不起作用,除非先创建一个int数组。

为了简化这些任务,我在net.mindview.util.Range包中创建了一个名为range()的方法,它可以自动地生成恰当的数组。

我的目的是将range()用做static导入:

//: control/ForEachInt.javaimport static net.mindview.util.Range.*;import static net.mindview.util.Print.*;public class ForEachInt {  public static void main(String[] args) {    for(int i : range(10)) // 0..9      printnb(i + " ");    print();    for(int i : range(5, 10)) // 5..9      printnb(i + " ");    print();    for(int i : range(5, 20, 3)) // 5..20 step 3      printnb(i + " ");    print();  }} /* Output:0 1 2 3 4 5 6 7 8 95 6 7 8 95 8 11 14 17*///:~


range()方法已经被重载,重载表示相同的方法名可以具有不同的参数列表。

range()的第一种重载形式是从0开始产生值,直至范围的上限,但不包括该上限。

第二种形式从第一个值开始产生值,直至比第二个值小1的值为止。

第三种形式有一个步进值,因此它每次的增量为该值。

range()是所谓生成器的一个非常简单的版本,有关生成器的内容将在本书稍后进行介绍。

请注意,尽管range()使得foreach语法可以适用于更多的场合,并且这样做似乎可以增加可读性,但是它的效率会稍许降低,

因此如果您在做性能调优,也许应该使用仿真器来做评价。

你会注意到,除了print()之外,我们还使用了printnb().

printnb()方法不会换行,因此可以使用它将一行拆分成多个片段输出。

foreach语法不仅在录入代码时可以节省时间,更重要的是,它阅读起来也要容易得多,

它说明您正在努力做什么(例如获取数组中的每一个元素),而不是给出你正在如何做的细节

(例如正在创建索引,因此可以使用它来选取数组中的每一个元素)。

在本书中,我们只要有可能就会使用foreach语法。


原创粉丝点击