Java 中 for 循环的三种方式

302 阅读3分钟

1. 普通 for 循环

普通for循环语法格式如下所示:

for(初始化语句; 条件语句; 迭代语句) {
    循环体代码
}
语句功能举例
初始化语句循环结构的初始部分,为循环变量赋初值int i = 0
条件语句循环结构的循环条件i > 10
迭代语句循环结构的迭代部分,通常使用++--运算符来修改循环变量的值i ++

for关键字后面括号中的三个语句必须用;隔开。

for循环中,无论缺少哪部分语句,都可以在程序的其他位置补充,从而保持for循环的完整性,使循环正常执行。

如果循环体只有一行语句,那么循环体的大括号可以省略。这样虽然代码还是可以正常执行,不过为了程序的阅读准确性,建议还是加上。

一般选择循环变量时,习惯选择ijk来作为循环变量。

1.1. 全部语句不为空

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

1.2. 全部语句为空

for循环中初始化、条件以及迭代部分都可以为空语句(但;不能省略),三者均为空的时候,相当于一个无限循环。等同于while(true){...}

for (;;) {
    System.out.println("aaa");
}
//for 语句不能在未抛出异常的情况下完成
while (true){
    System.out.println("aaa");
}
//while 语句不能在未抛出异常的情况下完成

1.3. 初始化语句为空

for循环中初始化语句为空时,初始化可以在程序的其他位置给出:

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");

//相当于for循环中的赋值语句
int i = 0;

for (; i < list.size(); i++) {
    System.out.println(list.get(i));
}

1.4. 条件语句为空

for循环中条件语句为空时,将没有循环的终止条件。此时for循环语句会认为条件语句的值总是为true,循环将无限执行下去。因此,为了使循环达到某种条件时退出,需要在语句块中进行逻辑判断,并使用break语句来跳出循环,否则将产生死循环。

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");

for (int i = 0; ; i++) {
    //终止循环的条件
    if (i == list.size()) {
        break;
    }
    System.out.println(list.get(i));
}

1.5. 迭代语句为空

for循环中迭代语句为空时,也就没有设置控制变量的表达式,即每次循环之后无法改变变量的值,此时也无法保证循环正常结束。所以需要在循环体中添加迭代语句。

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");

for (int i = 0; i < list.size(); ) {
    System.out.println(list.get(i));
    //迭代语句
    i++;
}

2. 增强 for 循环

增强for循环,也称为foreach循环,是一种简化版的循环语法。

在每次迭代中,增强for循环提供对当前元素的只读访问权限,不能直接修改元素的值。

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");

for (String s : list) {
    System.out.println(s);
}

相比增强for循环,普通for循环提供了更底层的操作,更加灵活,但使用也更加繁琐。普通for循环通过索引访问集合或数组中的元素,可以直接读取和修改元素的值。

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
    list.set(i, list.get(i) + "_plus");
}

for (String s : list) {
    System.out.println(s);
}

打印结果:

aaa
bbb
ccc
ddd
aaa_plus
bbb_plus
ccc_plus
ddd_plus

3. Lambda 表达式 for 循环

Lambda表达式是Java 8引入的一种函数式编程特性,它可以用于简化代码和实现函数式接口。

Lambda表达式for循环采用函数式编程风格,通过Lambda表达式定义循环体的操作,使代码更加简洁和易读。

与增强型for循环类似,Lambda表达式for循环自动迭代集合或数组中的元素,无需手动控制索引。

Lambda表达式可以访问循环外部的局部变量,无需声明为final,但变量在Lambda表达式中是隐性final(即不可修改)。

List<String> list = Arrays.asList("aaa", "bbb", "ccc", "ddd");
int a = 1;
list.forEach(s -> {
    System.out.println(s);
    //a = 2;编译报错,lambda 表达式中使用的变量应为 final 或有效 final
});