Java - Lambda Stream ForEach 循環中不能中止循環並退出??為何???


    我們在工作中一定經常使用for循環遍歷,若是想在某一個條件退出,直接ruturn即可;

private static void arrayListForEach(){
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("A");
        arrayList.add("B");
        arrayList.add("C");
        arrayList.add("D");
        arrayList.add("E");
        arrayList.add("F");

        for (String ar: arrayList) {
            System.out.println("ar = " + ar);
            switch (ar) {
                case "E":
                    System.out.println("array => " + ar);
                    return;
                default:
                    break;
            }

        }
        System.out.println("================== ");
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println("arr = " + arrayList.get(i));
            if ("c".equalsIgnoreCase(arrayList.get(i))){
                System.out.println("brr => " + arrayList.get(i));
                return;
            }
        }
    }

    輸出:(我們可以看到在循環的“E”的時候,return生效了,直接中止了循環,常規操作吧。。。)

ar = A
ar = B
ar = C
ar = D
ar = E
array => E

    但是我們現在大多數在用java8中的lambda也就是Stream處理數據或者處理循環數據,這個時候我們要是還想用上面的方式中止循環就有問題了;

private static void arrayListForEach(){
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("A");
        arrayList.add("B");
        arrayList.add("C");
        arrayList.add("D");
        arrayList.add("E");
        arrayList.add("F");

        /*for (String ar: arrayList) {
            System.out.println("ar = " + ar);
            switch (ar) {
                case "E":
                    System.out.println("array => " + ar);
                    return;
                default:
                    break;
            }
        }*/
        arrayList.forEach( ar -> {
            System.out.println("ar = " + ar);
            switch (ar) {
                case "E":
                    System.out.println("array => " + ar);
                    return;
                default:
                    break;
            }
        });

        System.out.println("================== ");
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println("arr = " + arrayList.get(i));
            if ("c".equalsIgnoreCase(arrayList.get(i))){
                System.out.println("brr => " + arrayList.get(i));
                return;
            }
        }
    }

  這里不管是換成:

arrayList.stream().forEachOrdered

  或者

arrayList.stream().forEach

  效果都是一樣的。。。

  輸出;(在遇到“E”的時候沒有中止循環,且直接走完了整個方法,這個return為什么沒有生效呢???)

ar = A
ar = B
ar = C
ar = D
ar = E
array => E
ar = F
================== 
arr = A
arr = B
arr = C
brr => C

    解決辦法:(使用arrayList.stream().anyMatch這個函數來進行遍歷即可)

    anyMatch()里接收一個返回值為boolean類型的表達式,只要返回true就會終止循環,這樣可以將業務邏輯寫在返回判斷結果前。

    當然arrayList.stream().filter(ar -> { System.out.println("ar=" + ar); return ar.equals("E"); }).findAny(); 也可以的;

private static void arrayListForEach(){
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("A");
        arrayList.add("B");
        arrayList.add("C");
        arrayList.add("D");
        arrayList.add("E");
        arrayList.add("F");

        /*for (String ar: arrayList) {
            System.out.println("ar = " + ar);
            switch (ar) {
                case "E":
                    System.out.println("array => " + ar);
                    return;
                default:
                    break;
            }
        }*/
        arrayList.stream().anyMatch( ar -> {
            System.out.println("ar = " + ar);
            switch (ar) {
                case "E":
                    System.out.println("array => " + ar);
                    return true;
                default:
                    break;
            }
            return false;
        });

        System.out.println("================== ");
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println("arr = " + arrayList.get(i));
            if ("c".equalsIgnoreCase(arrayList.get(i))){
                System.out.println("brr => " + arrayList.get(i));
                return;
            }
        }
    }

    輸出:(我們的預期一樣,遇到“E”就在此處中止循環,然后執行下一個任務,這樣似乎更加適合處理現實項目中出現的情況)

ar = A
ar = B
ar = C
ar = D
ar = E
array => E
================== 
arr = A
arr = B
arr = C
brr => C

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM