我們在工作中一定經常使用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