檢測 Java 中 for 迴圈的最後一次迭代
1. 概述
當我們迭代List
時, for
-each 迴圈是一個優雅而簡單的工具。有時,在某些情況下,我們需要執行特定操作或根據迭代是否為最後一次來做決策。
在本教程中,我們將討論這種情況,並探索在循環List.
2.問題介紹
首先,讓我們建立一個電影標題List
作為我們的輸入範例:
List<String> MOVIES = List.of(
"Titanic",
"The Deer Hunter",
"Lord of the Rings",
"One Flew Over the Cuckoo's Nest",
"No Country For Old Men");
如果我們只想在典型的for
-each 迴圈後取得最後一個元素,那麼這不是一個挑戰。我們可以簡單地在每次迭代中用元素重新分配相同的變數。當我們遍歷整個列表後,變數保存最後一個元素:
String myLastMovie = "";
for (String movie : MOVIES) {
// do some work with movie
myLastMovie = movie;
}
assertEquals("No Country For Old Men", myLastMovie);
然而,有時,我們只需要在最後一次迭代中執行一些特定的操作。因此,在循環期間,我們必須識別for
-each 循環中的最後一次迭代。
與傳統的for
迴圈不同,在傳統的 for 迴圈中,索引變數很容易指示當前迭代,而for
-each 迴圈隱藏了此資訊。因此,缺乏明確的循環索引對確定最後一次迭代提出了挑戰。
接下來我們來看看如何解決這個問題。
3.使用IntStream
我們知道使用傳統的for
循環解決問題並不困難,因為我們知道當前迭代的索引:
int size = MOVIES.size();
String myLastMovie = null;
for (int i = 0; i < size; i++) {
String movie = MOVIES.get(i)
// ... work with movie
if (i == size - 1) {
myLastMovie = movie;
}
}
assertEquals("No Country For Old Men", myLastMovie);
我們可以遵循相同的想法,建立一個包含清單元素的所有索引的IntStream
。然後,我們可以使用forEach()
方法循環索引並檢查目前是否是最後一次迭代,與傳統的for
迴圈相同:
int size = MOVIES.size();
Map<Integer, String> myLastMovie = new HashMap<>();
IntStream.range(0, size)
.forEach(idx -> {
String movie = MOVIES.get(idx);
// ... work with movie
if (idx == size - 1) {
myLastMovie.put(idx, movie);
}
});
assertEquals(1, myLastMovie.size());
assertTrue(myLastMovie.containsKey(size - 1));
assertTrue(myLastMovie.containsValue("No Country For Old Men"));
正如我們在測試中所看到的,我們使用IntStream.range(0, list.size())
方法來初始化列表的索引流。值得注意的是,我們使用了Map
物件來儲存最後的索引和值,以供以後驗證。這是因為lambda 中使用的局部變數必須是 Final 或實際上是 Final 。
4. 使用外部計數器
或者,我們可以維護一個外部計數器變數來追蹤迭代計數。透過將計數器與集合的大小進行比較,我們可以確定最後一次迭代:
int size = MOVIES.size();
String myLastMovie = null;
int cnt = 0;
for (String movie : MOVIES) {
// ... work with movie
if (++cnt == size) {
myLastMovie = movie;
}
}
assertEquals("No Country For Old Men", myLastMovie);
與IntStream
解決方案相比,這種方法更加簡單。
5. 使用Iterator
循環
雖然我們已經用IntStream
和counter
方法解決了這個問題,但這兩個解決方案都需要引入新變數並執行額外的比較來檢測最後一次迭代。
接下來,讓我們看看如何在使用Iterator
遍歷列表時確定最後一次迭代。
Iterator
提供了**hasNext()
方法,可以讓我們方便地檢查當前迭代是否是最後一次迭代**。因此,我們不需要為此目的添加額外的變數:
String movie;
String myLastMovie = null;
for (Iterator<String> it = MOVIES.iterator(); it.hasNext(); ) {
movie = it.next();
// ... work with movie
if (!it.hasNext()) { // the last element
myLastMovie = movie;
}
}
assertEquals("No Country For Old Men", myLastMovie);
正如我們所看到的,使用Iterator
是解決這個問題的最佳選擇。
六,結論
在本文中,我們探討了使用for
-each 迴圈遍歷List
時辨識最後一次迭代的三種方法。
憑藉其內建的hasNext()
檢查, Iterator
方法可以成為解決此特定挑戰的最佳解決方案。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。