在這篇文章中,我想和你一塊兒回到基礎知識,並討論 Java 中的 for 循環。老實說,我正在爲本身寫這篇博客文章,由於我也會這樣作。從 Java 8 開始,咱們沒必要在 Java 中編寫太多 for 循環!我但願這篇文章將使你的代碼更易於閱讀和編寫。算法
通常地說,for 循環執行兩類任務:數組
對於算法,for 循環多是合適的。看一下此算法,檢查數字是否爲三的冪:函數
double number = 81; for(; number > 1; number /=3); return number == 1;
在這裏,for 循環是合適的。這是一個很是簡單的示例,你能夠想象,使用更困難的算法會變得更加棘手。code
對於大多數開發人員而言,在他們的平常工做中,這種狀況不多。大多數時候,咱們使用 for 循環遍歷集合。讓咱們看一下該代碼的一些示例。索引
咱們首先來定義一個 List<String> 數組,並往裏面插入一些元素:開發
List<String> heroes = new ArrayList<>(); heroes.add("典韋"); heroes.add("雲中君"); heroes.add("魯班"); heroes.add("盤古"); heroes.add("大喬"); heroes.add("宮本武藏"); heroes.add("裴擒虎"); heroes.add("明世隱");
有不少方法能夠對其進行迭代。讓咱們從至關古老的迭代器方法開始:get
Iterator<String> heroesIterator = heroes.iterator(); while (heroesIterator.hasNext()) { System.out.println(heroesIterator.next()); }
這種代碼使 Java 在冗長性上享有應有的聲譽。博客
此次嘗試使用經典的索引 for 循環:it
for (int i = 0; i < heroes.size(); i++) { System.out.println(heroes.get(i)); }
嗯,這有點簡單,可是在 Java 5 以後,咱們能夠這樣處理循環:stream
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 中編寫如此多的 for 循環,forEach 就成爲了你的第二選擇,那麼你應該看看 Java 中的 Streams。
例如,使用相似的語法,你能夠輕鬆選擇全部以 「魯」 開頭的英雄:
heroes.stream().filter(hero -> hero.startsWith("魯")) .forEach(System.out::println);
運行結果會顯示小短腿「魯班」。
中止編寫太多 for 循環,完成後,Java 8 Streams 將天然而然地出現,你的代碼將更易於閱讀和編寫。