在這篇文章中,我想和你一起回到基礎知識,並討論 Java 中的 for 循環。老實說,我正在為自己寫這篇博客文章,因為我也會這樣做。從 Java 8 開始,我們不必在 Java 中編寫太多 for 循環!我希望這篇文章將使你的代碼更易於閱讀和編寫。
你需要 for 循環做什么?
一般地說,for 循環執行兩類任務:
- 遍歷集合
- 運行算法
對於算法,for 循環可能是合適的。看一下此算法,檢查數字是否為三的冪:
double number = 81;
for(; number > 1; number /=3);
return number == 1;
在這里,for 循環是合適的。這是一個非常簡單的示例,你可以想象,使用更困難的算法會變得更加棘手。
對於大多數開發人員而言,在他們的日常工作中,這種情況很少。大多數時候,我們使用 for 循環遍歷集合。讓我們看一下該代碼的一些示例。
遍歷 Java 中的集合
我們首先來定義一個 List
List<String> heroes = new ArrayList<>();
heroes.add("典韋");
heroes.add("雲中君");
heroes.add("魯班");
heroes.add("盤古");
heroes.add("大喬");
heroes.add("宮本武藏");
heroes.add("裴擒虎");
heroes.add("明世隱");
有很多方法可以對其進行迭代。讓我們從相當古老的迭代器方法開始:
Iterator<String> heroesIterator = heroes.iterator();
while (heroesIterator.hasNext()) {
System.out.println(heroesIterator.next());
}
這種代碼使 Java 在冗長性上享有應有的聲譽。
這次嘗試使用經典的索引 for 循環:
for (int i = 0; i < heroes.size(); i++) {
System.out.println(heroes.get(i));
}
嗯,這有點簡單,但是在 Java 5 之后,我們可以這樣處理循環:
for (String hero : heroes) {
System.out.println(hero);
}
這是大多數開發人員陷入困境的地方。這種結構非常熟悉並且易於遵循,以至於我們大多數人都不會去考慮更好的東西。但是在 Java 8 以后我們可以使用 forEach 函數來進行簡化。
借助 Java 8,我們可以使用 forEach 函數:
heroes.forEach(hero -> System.out.println(hero));
我們可以進一步簡化它:
heroes.forEach(System.out::println);
在我們只是迭代數組的元素時,這樣會使代碼很簡潔。
下一步呢?使用 Java Streams
一旦停止在 Java 中編寫如此多的 for 循環,forEach 就成為了你的第二選擇,那么你應該看看 Java 中的 Streams。
例如,使用類似的語法,你可以輕松選擇所有以 “魯” 開頭的英雄:
heroes.stream().filter(hero -> hero.startsWith("魯"))
.forEach(System.out::println);
運行結果會顯示小短腿“魯班”。
總結
停止編寫太多 for 循環,完成后,Java 8 Streams 將自然而然地出現,你的代碼將更易於閱讀和編寫。