您的位置:首页 > 编程语言 > Java开发

[Thinking in Java]之控制执行(Controling Execution)(二)

2013-06-01 20:16 267 查看
The comma operator(逗号运算符)
逗号运算符(不是逗号分隔符,它用在分隔变量的定义和方法的参数)在Java中has only one use:在for循环的控制表达式中,在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句。而且那些语句均会独立执行。下面看一个例子:
1-1 逗号运算符的例子

//: control/CommaOperator.java
public class CommaOperator {
public static void main(String[] args) {
for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
System.out.println("i = " + i + " j = " + j);
}
}
}
程序运行的结果如下:



注意
变量的初始化部分虽然可以定义不同的变量,但是变量的类型必须是一样的,在上述代码中
int i = 1, j = i + 10;
即变量i、j均为int类型。

这样的方式只能在for循环中使用,在其他的选择与循环中不能这样使用。

Foreach syntax(foreach语句)
foreach语句是JDK5中的新语法,主要是方便数组(arrays)和容器(containers)的操作,原因是:在循环中你不在需要自己定义一个循环计数的变量,foreach语句自动地帮你遍历每一项。
1-2 foreach语句的例子
//: control/ForEachFloat.java
import 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);
}
}
程序执行的结果如下:



注意
数组的初始化利用正常形式的for循环,因为必须利用下标给出的地址给内存单元赋初值。

语句
for(float x : f)
是指定义一个float类型的变量x,将数组f中的元素循环赋值给x

任何返回数组类型的方法都可以利用foreach实现,比如,String类有一个toCharArray()方法,其返回一个char类型的数组,因此可以利用foreach很简单的迭代字符串的每一项。
1-3 foreach迭代字符串的每一项

//: control/ForEachString.java
public class ForEachString {
public static void main(String[] args) {
for(char c : "An African Swallow".toCharArray() )
System.out.print(c + " ");
}
}
程序运行的结果如下:



foreach同样适用于任何Iterable类型的对象。
在许多涉及到逐步操作整型类型的数列中,像下面这样的语句
for(int i = 0; i < 100; i++)
这些情况下,除非首先已定义好一个int类型的数组,否则foreach是无能为力的。这个时候时候要简化上面for语句的操作就得另外想办法了。
1-4 利用自己创建的类简化普通for语句的操作的例子

//: control/ForEachInt.java
import 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();
}
}
程序运行的结果如下:



注意
import static net.mindview.util.Range.*;
就是导入自己写好的方法
range(
),其完整代码如下:

//: net/mindview/util/Range.java
// Array creation methods that can be used without
// qualifiers, using Java SE5 static imports:
package net.mindview.util;
public class Range {
// Produce a sequence [0..n)
public static int[] range(int n) {
int[] result = new int
;
for(int i = 0; i < n; i++)
result[i] = i;
return result;
}
// Produce a sequence [start..end)
public static int[] range(int start, int end) {
int sz = end - start;
int[] result = new int[sz];
for(int i = 0; i < sz; i++)
result[i] = start + i;
return result;
}
// Produce a sequence [start..end) incrementing by step
public static int[] range(int start, int end, int step) {
int sz = (end - start)/step;
int[] result = new int[sz];
for(int i = 0; i < sz; i++)
result[i] = start + (i * step);
return result;
}
}


range()可以使用在大多的场合。


foreach语句不仅简化了for语句(敲更少的代码),更重要的是它的可读性更好,直接告诉你操作的目的(得到数组的每一个元素),而不用给出怎么做的细节(for循环中创建下标,在以后的操作中依靠此来选择数组中的每一个元素)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java