Java 8 之前终止单层For循环

功能代码:

// break 终止循环
        for (int i=0; i< 10; i++){
            if(i == 5) {
                break;
            }
            System.out.println("当前 i值为:"  + i);
        }
        System.out.println("--------------------------");
        // continue 跳出当前循环,执行下一个循环
        for (int j=0; j< 10; j++){
            if(j == 5) {
                continue;
            }
            System.out.println("当前 j值为:"  + j);
        }
        System.out.println("--------------------------");

控制台输出:

当前 i值为:0
当前 i值为:1
当前 i值为:2
当前 i值为:3
当前 i值为:4
--------------------------
当前 j值为:0
当前 j值为:1
当前 j值为:2
当前 j值为:3
当前 j值为:4
当前 j值为:6
当前 j值为:7
当前 j值为:8
当前 j值为:9
--------------------------

Java 关键字break 和continue 总结:

  • break语句可以跳出当前循环;
  • break语句通常配合if,在满足条件时提前结束整个循环;
  • break语句总是跳出最近的一层循环;
  • continue语句可以提前结束本次循环;
  • continue语句通常配合if,在满足条件时提前结束本次循环。

Java 8 之前终止单层For循环拓展

疑惑1:Java 通过return关键字终止程序执行,实现终止for 循环

功能代码:

public static void main(String[] args) {
        // break 终止循环
        for (int i=0; i< 10; i++){
            if(i == 5) {
                break;
            }
            System.out.println("当前 i值为:"  + i);
        }
        System.out.println("--------------------------");
        // continue 跳出当前循环,执行下一个循环
        for (int j=0; j< 10; j++){
            if(j == 5) {
                continue;
            }
            System.out.println("当前 j值为:"  + j);
        }
        System.out.println("--------------------------");
        // return 终止程序执行,实现终止当前for 循环
        for (int j=0; j< 10; j++){
            if(j == 5) {
                return;
            }
            System.out.println("当前 j值为:"  + j);
        }
        System.out.println("--------------------------");

        // 基于IntStream.range() 生成连续集合
        List<Integer> colls =  IntStream.range(1, 10).boxed().collect(Collectors.toList());
        // Java8 Stream 终止循环
        colls.stream().forEach(item ->{
            // 判断return关键字,在Stream中不生效
            if(item == 5){
                return;
            }
            // 判断continue/break关键字,在Stream中不允许使用
//            if(item == 5){
//                continue;
//            }
//            if(item == 5){
//                break;
//            }
            System.out.println("Stream 当前item 值为:" + item);
        });

        System.out.println("--------------------------");

        // Java8 Stream 终止循环,通过throws RuntimeException
        colls.stream().forEach(item ->{
            if (item == 5) {
                throw new RuntimeException("通过抛出异常,终止for循环");
            }
            System.out.println("Stream 当前item 值为:" + item);
        });

    }

控制台输出:

当前 i值为:0
当前 i值为:1
当前 i值为:2
当前 i值为:3
当前 i值为:4
--------------------------
当前 j值为:0
当前 j值为:1
当前 j值为:2
当前 j值为:3
当前 j值为:4
当前 j值为:6
当前 j值为:7
当前 j值为:8
当前 j值为:9
--------------------------
当前 j值为:0
当前 j值为:1
当前 j值为:2
当前 j值为:3
当前 j值为:4

结论:通过return 终止程序执行,实现终止for 循环可行

疑惑2:Java 通过抛出异常throw RunTimeException终止程序执行,实现终止for 循环。

功能代码:

public static void main(String[] args) {
        // break 终止循环
        for (int i=0; i< 10; i++){
            if(i == 5) {
                break;
            }
            System.out.println("当前 i值为:"  + i);
        }
        System.out.println("--------------------------");
        // continue 跳出当前循环,执行下一个循环
        for (int j=0; j< 10; j++){
            if(j == 5) {
                continue;
            }
            System.out.println("当前 j值为:"  + j);
        }
        System.out.println("--------------------------");
        // return 终止程序执行,实现终止当前for 循环
//        for (int j=0; j< 10; j++){
//            if(j == 5) {
//                return;
//            }
//            System.out.println("当前 j值为:"  + j);
//        }
        // 通过抛出异常:throw RuntimeException,终止程序执行, 实现终止当前for循环
        for (int j=0; j< 10; j++){
            if(j == 5) {
                throw new RuntimeException("通过抛出异常,终止程序执行,实现终止当前for循环");
            }
            System.out.println("当前 j值为:"  + j);
        }
        System.out.println("--------------------------");

        // 基于IntStream.range() 生成连续集合
        List<Integer> colls =  IntStream.range(1, 10).boxed().collect(Collectors.toList());
        // Java8 Stream 终止循环
        colls.stream().forEach(item ->{
            // 判断return关键字,在Stream中不生效
            if(item == 5){
                return;
            }
            // 判断continue/break关键字,在Stream中不允许使用
//            if(item == 5){
//                continue;
//            }
//            if(item == 5){
//                break;
//            }
            System.out.println("Stream 当前item 值为:" + item);
        });

        System.out.println("--------------------------");

        // Java8 Stream 终止循环,通过throws RuntimeException
        colls.stream().forEach(item ->{
            if (item == 5) {
                throw new RuntimeException("通过抛出异常,终止for循环");
            }
            System.out.println("Stream 当前item 值为:" + item);
        });

    }

控制台输出:

当前 i值为:0
当前 i值为:1
当前 i值为:2
当前 i值为:3
当前 i值为:4
--------------------------
当前 j值为:0
当前 j值为:1
当前 j值为:2
当前 j值为:3
当前 j值为:4
当前 j值为:6
当前 j值为:7
当前 j值为:8
当前 j值为:9
--------------------------
当前 j值为:0
当前 j值为:1
当前 j值为:2
当前 j值为:3
当前 j值为:4
Exception in thread "main" java.lang.RuntimeException: 通过抛出异常,终止程序执行,实现终止当前for循环
    at ForTest.main(ForTest.java:34)

结论:通过抛出异常throw RuntimeException() 终止程序执行,实现终止for 循环可行。

Java 8 Stream终止foreach循环

功能代码:

// 基于IntStream.range() 生成连续集合
        List<Integer> colls =  IntStream.range(1, 10).boxed().collect(Collectors.toList());
        // Java8 Stream 终止循环
        colls.stream().forEach(item ->{
            // 判断return关键字,在Stream中不生效
            if(item == 5){
                return;
            }
            // 判断continue/break关键字,在Stream中不允许使用
//            if(item == 5){
//                continue;
//            }
//            if(item == 5){
//                break;
//            }
            System.out.println("Stream 当前item 值为:" + item);
        });

控制台输出:

--------------------------
Stream 当前item 值为:1
Stream 当前item 值为:2
Stream 当前item 值为:3
Stream 当前item 值为:4
Stream 当前item 值为:6
Stream 当前item 值为:7
Stream 当前item 值为:8
Stream 当前item 值为:9
--------------------------

Java8 Stream 关键字break、continue和return 总结:

  • java8 Stream 不支持关键字break 和continue
  • java8 Stream 通过return 关键字无法实现暂停/终止foreach 执行。

Java8 Stream 终止foreach 循环拓展

解决思路:通过抛出异常throw RuntimeException 终止程序执行,实现终止foreach 执行

功能代码:

// Java8 Stream 终止循环,通过throws RuntimeException
        colls.stream().forEach(item ->{
            if (item == 5) {
                throw new RuntimeException("通过抛出异常,终止for循环");
            }
            System.out.println("Stream 当前item 值为:" + item);
        });

控制台输出:

--------------------------
Stream 当前item 值为:1
Stream 当前item 值为:2
Stream 当前item 值为:3
Stream 当前item 值为:4
Exception in thread "main" java.lang.RuntimeException: 通过抛出异常,终止for循环
    at ForTest.lambda$main$1(ForTest.java:63)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at ForTest.main(ForTest.java:61)

Java 跳出嵌套For循环

方式一:通过return 关键字 跳出 嵌套for 循环。

情况一:无返回值函数

/**
     * 自定义函数 没有返回值,通过return 终止嵌套for 循环
     */
    public void noValue(){
        for (int i = 0; i <= 10; i++){
            for (int j=0; j<=10; j++){
                if (j == 5) {
                    return;
                }
                System.out.println("当前j值为:" + j);
            }
            System.out.println("当前i值为:" + i);
        }
    }

情况二:有返回值函数

/**
     * 自定义函数 有返回值,通过return 终止嵌套for 循环
     */
    public Integer value(){
        for (int i = 0; i <= 10; i++){
            for (int j=0; j<=10; j++){
                if (j == 5) {
                    return j;
                }
                System.out.println("当前j值为:" + j);
            }
            System.out.println("当前i值为:" + i);
        }
        return 0;
    }

代码验证:

public static void main(String[] args) {
        ForTest instance = new ForTest();
        instance.noValue();
        System.out.println("--------------");
        Integer num = instance.value();
        System.out.println("返回值为:" + num);
    }

控制台输出:

当前j值为:0
当前j值为:1
当前j值为:2
当前j值为:3
当前j值为:4
--------------
当前j值为:0
当前j值为:1
当前j值为:2
当前j值为:3
当前j值为:4
返回值为:5

方式二:通过定义一个布尔值标识变量,实现终止/暂停嵌套for循环。

情况一:无返回值函数

/**
     * 自定义函数 没有返回值,通过布尔标识变量 终止/暂停嵌套for 循环
     */
    public void noValue(){
        // 定义布尔值标识变量
        boolean target = true;
        for (int i = 0; i <= 10 && target; i++){
            for (int j=0; j<=10 && target; j++){
                if (j == 5) {
                    target = false;
                }
                System.out.println("当前j值为:" + j);
            }
            System.out.println("当前i值为:" + i);
        }
    }

情况二:有返回值函数

/**
     * 自定义函数 有返回值,通过布尔标识变量 终止/暂停嵌套for 循环
     */
    public Integer value(){
        // 定义布尔值标识变量
        boolean target = true;
        for (int i = 0; i <= 10 && target; i++){
            for (int j=0; j<=10 && target; j++){
                if (j == 5) {
                    target = false;
                    return j;
                }
                System.out.println("当前j值为:" + j);
            }
            System.out.println("当前i值为:" + i);
        }
        return 0;
    }

代码验证:

public static void main(String[] args) {
        ForTest instance = new ForTest();
        instance.noValue();
        System.out.println("--------------");
        Integer num = instance.value();
        System.out.println("返回值为:" + num);
    }

控制台输出:

当前j值为:0
当前j值为:1
当前j值为:2
当前j值为:3
当前j值为:4
当前j值为:5
当前i值为:0
--------------
当前j值为:0
当前j值为:1
当前j值为:2
当前j值为:3
当前j值为:4
返回值为:5

方式三:通过抛出异常,实现终止/暂停嵌套For 循环

情况一:无返回值函数

/**
     * 自定义函数 没有返回值,通过抛出异常 终止/暂停嵌套for 循环
     */
    public void noValue(){
        for (int i = 0; i <= 10; i++){
            for (int j=0; j<=10; j++){
                if (j == 5) {
                   throw new RuntimeException("通过抛出运行异常,终止/暂停嵌套for 循环");
                }
                System.out.println("当前j值为:" + j);
            }
            System.out.println("当前i值为:" + i);
        }
    }

情况二:有返回值函数

/**
     * 自定义函数 有返回值,通过抛出异常 终止/暂停嵌套for 循环
     */
    public Integer value(){
        int num = 0;
        for (int i = 0; i <= 10; i++){
            for (int j=0; j<=10; j++){
                num = j;
                if (j == 5) {
                    throw new RuntimeException("通过抛出运行异常,终止/暂停嵌套for 循环");
                }
                System.out.println("当前j值为:" + j);
            }
            System.out.println("当前i值为:" + i);
        }
        return num;
    }

代码测试:

public static void main(String[] args) {
        ForTest instance = new ForTest();
        instance.noValue();
        System.out.println("--------------");
        Integer num = instance.value();
        System.out.println("返回值为:" + num);
    }

控制台输出:

Exception in thread "main" java.lang.RuntimeException: 通过抛出运行异常,终止/暂停嵌套for 循环
    at ForTest.noValue(ForTest.java:84)
    at ForTest.main(ForTest.java:72)
当前j值为:0
当前j值为:1
当前j值为:2
当前j值为:3
当前j值为:4

Process finished with exit code 1