在迭代期間向集合添加元素
一、簡介
迭代List
是Java中常見的操作,但在迭代時新增元素需要仔細考慮,以避免異常並確保程式碼的正確性。
在本教程中,我們將討論在迭代期間向集合添加元素的幾種方法。
2.使用ListIterator
類
一種常見的方法是ListIterator
,它提供清單的雙向遍歷和修改功能。
2.1.字串場景
考慮以下範例,我們在遇到Python
後將元素JavaScript
加入程式語言清單中:
List<String> programmingLanguages = new ArrayList<>(List.of("Java", "Python", "C++"));
@Test
public void givenList_whenAddElementWithListIterator_thenModifiedList() {
ListIterator<String> listIterator = programmingLanguages.listIterator();
while (listIterator.hasNext()) {
String language = listIterator.next();
if (language.equals("Python")) {
listIterator.add("JavaScript");
}
}
assertIterableEquals(Arrays.asList("Java", "Python", "JavaScript", "C++"), programmingLanguages);
}
在提供的程式碼中,我們初始化一個名為programmingLanguages
的列表,其中包含字串( Java
、 Python
和C++
)。此外,我們使用listIterator.next()
方法來迭代列表的元素。
當我們遇到Python
元素時,我們使用listIterator.add(“JavaScript”)
動態地在它後面立即插入字串JavaScript
。
最後,測試斷言修改後的清單與預期結果匹配,確保在清單中的Python
之後成功加入JavaScript
。
2.2.數值場景
讓我們將ListIterator
方法應用於整數列表,在遇到數字 2 時將值加倍:
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
@Test
public void givenNumericalList_whenMultiplyElementWithListIterator_thenModifiedList() {
ListIterator<Integer> listIterator = numbers.listIterator();
while (listIterator.hasNext()) {
int num = listIterator.next();
if (num == 2) {
listIterator.add(num * 10);
}
}
assertIterableEquals(Arrays.asList(1, 2, 20, 3), numbers);
}
在此數位場景中,我們使用ListIterator
來迭代整數列表。當遇到數字 2 時,該值會乘以 10 並動態加入到清單中。
3. 附副本的增強型 For 循環
另一種策略涉及建立原始清單的副本並在修改原始清單時對其進行迭代。
3.1.字串場景
考慮以下範例,我們將原始清單中每個單字的大寫版本新增至清單本身:
@Test
public void givenStringList_whenAddElementWithEnhancedForLoopAndCopy_thenModifiedList() {
List<String> copyOfWords = new ArrayList<>(programmingLanguages);
for (String word : copyOfWords) {
programmingLanguages.add(word.toUpperCase());
}
assertIterableEquals(Arrays.asList("Java", "Python", "C++", "JAVA", "PYTHON", "C++"), programmingLanguages);
}
在增強的 for 循環中,我們迭代copyOfWords
列表的每個元素,將相應的值轉換為大寫,並將其添加到原始列表programmingLanguages
中。
值得注意的是,此插入過程可確保使用現有單字的大寫版本擴展原始列表,同時保持序列完整性。換句話說, programmingLanguages
清單將包含原始元素,後面跟著新添加的大寫版本。
3.2.數值場景
現在,讓我們將增強的 for 迴圈方法應用於整數列表,將每個數字乘以 2 相加:
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
@Test
public void givenList_whenAddElementWithEnhancedForLoopAndCopy_thenModifiedList() {
List<Integer> copyOfNumbers = new ArrayList<>(numbers);
for (int num : copyOfNumbers) {
numbers.add(num * 2);
}
assertIterableEquals(Arrays.asList(1, 2, 3, 2, 4, 6), numbers);
}
在這裡,我們進行迭代,將每個元素乘以 2,並將其添加到原始列表中。與字串方法相同,
4. 利用 Java 8 流方法
Java 8 Streams 提供了在迭代期間為清單新增元素的簡潔方法。
4.1.字串場景
考慮以下範例,我們使用 Java 8 Streams 將字串JavaScript
新增至programmingLanguages
清單:
@Test
public void givenStringList_whenConvertToUpperCaseWithJava8Stream_thenModifiedList() {
programmingLanguages = programmingLanguages.stream().map(String::toUpperCase).collect(Collectors.toList());
assertIterableEquals(Arrays.asList("JAVA", "PYTHON", "C++"), programmingLanguages);
}
在此程式碼片段中,我們利用map
操作,使用toUpperCase
方法將清單中的每個字串元素轉換為其等效的大寫字母。然後,我們使用Collectors.toList()
將轉換後的元素收集到一個新清單中。
但是,必須注意的是,每個新元素都會直接更改清單中相應的原始元素。這種直接變更展示了原始清單內容的轉換,同時保留了其完整性。
4.2.數值場景
讓我們將 Java 8 Stream 方法應用於整數列表,將每個數字乘以 3:
@Test
public void givenNumericalList_whenMultiplyByThreeWithJava8Stream_thenModifiedList() {
numbers = numbers.stream().map(num -> num * 3).collect(Collectors.toList());
assertIterableEquals(Arrays.asList(3, 6, 9), numbers);
}
在這個測試方法中,我們利用map
操作,列表中的每個數字元素都會經過一次乘以 3 的轉換。此外,結果流透過Collectors.toList()
收集到一個新列表中。
5. 結論
總之,我們探索了多種方法,包括ListIterator
、帶有副本的增強型 for 循環和 Java 8 Streams,用於在 Java 迭代期間向列表添加元素。
與往常一樣,隨附的源代碼可以 在 GitHub 上找到。