Java list foreach add

1. Modifying original List throws CMEx :

While iterating List/ArrayList, if we try to modify original List like adding/removing elements then program throws ConcurrentModificationException. We will try this with 3 different loops as mentioned below,

  1. Using forEach loop from Java 1.5 version
  2. Using Iterator interface from Java 1.2 version
  3. Using ListIterator interface from Java 1.2 version

1.1 Using forEach loop

  • Here, we are trying to remove elements while iterating List using forEach loop which throws ConcurrentModificationException

AddRemoveWhileIteratingUsingForEachLoop.java

package in.bench.resources.listiterator; import java.util.ArrayList; public class AddRemoveWhileIteratingUsingForEachLoop < public static void main(String[] args) < // Fruits list ArrayListfruits = new ArrayList(); fruits.add("Melons"); fruits.add("Mango"); fruits.add("Apple"); fruits.add("Cherry"); fruits.add("Grapes"); // print to console System.out.println("Original Fruit List :- \n" + fruits + "\n\n"); // iterate List elements using forEach loop for(String fruit : fruits) < // try to remove from original List fruits.remove(fruit); >// print to console System.out.println("\nAfter removal of Melons & addition of Banana :- \n" + fruits); > >

Output:

Original Fruit List :- [Melons, Mango, Apple, Cherry, Grapes] Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at in.bench.resources.listiterator.AddRemoveWhileIteratingUsingForEachLoop .main(AddRemoveWhileIteratingUsingForEachLoop.java:23)

1.2 Using Iterator

  • Here, we are trying to remove an element while iterating List using Iterator interface which also throws ConcurrentModificationException
  • Iterator has 2 useful methods namely,
    1. hasNext() method – allows to check whether there are any elements present in the List
    2. next() method – used to get next element if there are elements present in the List
Читайте также:  @font-face

RemoveElementWhileIteratingUsingIterator2.java

package in.bench.resources.listiterator; import java.util.ArrayList; import java.util.Iterator; public class RemoveElementWhileIteratingUsingIterator2 < public static void main(String[] args) < // Fruits list ArrayListfruits = new ArrayList(); fruits.add("Melons"); fruits.add("Mango"); fruits.add("Apple"); fruits.add("Cherry"); fruits.add("Grapes"); // print to console System.out.println("Original Fruit List :- \n" + fruits + "\n\n"); // get Iterator Iterator iterator = fruits.iterator(); // iterate using Iterator while(iterator.hasNext()) < // try to add/remove from original List if(iterator.next().equalsIgnoreCase("Melons")) < fruits.remove("Melons"); >> // print to console System.out.println("\nAfter removal of Cherry :- \n" + fruits); > >

Output:

Original Fruit List :- [Melons, Mango, Apple, Cherry, Grapes] Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at in.bench.resources.listiterator.RemoveElementWhileIteratingUsingIterator2 .main(RemoveElementWhileIteratingUsingIterator2.java:31)

1.3 Using ListIterator

  • Here, we are trying to add an element while iterating List using ListIterator interface which also throws ConcurrentModificationException
  • Like Iterator, ListIterator also has 2 useful methods namely,
    1. hasNext() method – allows to check whether there are any elements present in the List
    2. next() method – used to get next element if there are elements present in the List

AddRemoveWhileIteratingThrowsCMEx.java

package in.bench.resources.listiterator; import java.util.ArrayList; import java.util.ListIterator; public class AddRemoveWhileIteratingThrowsCMEx < public static void main(String[] args) < // Fruits list ArrayListfruits = new ArrayList(); fruits.add("Melons"); fruits.add("Mango"); fruits.add("Apple"); fruits.add("Cherry"); fruits.add("Grapes"); // print to console System.out.println("Original Fruit List :- \n" + fruits + "\n\n"); // iterate using Iterator ListIterator listIterator = fruits.listIterator(); // Forward Iterating while(listIterator.hasNext()) < if(listIterator.next().equalsIgnoreCase("Grapes")) < // trying to add element to Original list fruits.add("Banana"); >> // print to console System.out.println("\nAfter removal of Cherry & addition of Banana :- \n" + fruits); > >

Output:

Original Fruit List :- [Melons, Mango, Apple, Cherry, Grapes] Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967) at in.bench.resources.listiterator.AddRemoveWhileIteratingThrowsCMEx .main(AddRemoveWhileIteratingThrowsCMEx.java:30)

2. Adding/removing elements to/from List :

Iterating using Iterator/ListIterator allows to add/remove element and these modification (add/remove) is reflected in the original List. We will see 2 different examples using Iterator and ListIterator,

Читайте также:  Cpp default function arguments

2.1 Remove element using Iterator interface

  • Using Iterator, we can only remove element from iterating List using remove() method
  • But there should be some operations involving obtained iterator otherwise program throws java.lang.IllegalStateException
  • Note:- use remove() method of Iterator interface for removing elements from iterating List otherwise modifying original List still throws ConcurrentModificationException as shown in the above example 1.2

RemoveElementWhileIteratingUsingIterator.java

package in.bench.resources.listiterator; import java.util.ArrayList; import java.util.Iterator; public class RemoveElementWhileIteratingUsingIterator < public static void main(String[] args) < // Fruits list ArrayListfruits = new ArrayList(); fruits.add("Melons"); fruits.add("Mango"); fruits.add("Apple"); fruits.add("Cherry"); fruits.add("Grapes"); // print to console System.out.println("Original Fruit List :- \n" + fruits); // get Iterator Iterator iterator = fruits.iterator(); // iterate while(iterator.hasNext()) < if(iterator.next().equalsIgnoreCase("Cherry")) iterator.remove(); >// print to console System.out.println("\nAfter removal of Cherry :- \n" + fruits); > >

Output:

Original Fruit List :- [Melons, Mango, Apple, Cherry, Grapes] After removal of Cherry :- [Melons, Mango, Apple, Grapes]

2.2 Add/Remove element using ListIterator interface

  • Like Iterator, ListIterator needs some operations involving obtained listIterator otherwise program throws java.lang.IllegalStateException
  • Unlike Iterator, ListIterator has methods to add/remove elements from iterating List using add() and remove() methods respectively
  • Note:- use add() or remove() methods of ListIterator interface for adding or removing elements from iterating List respectively otherwise modifying original List still throws ConcurrentModificationException as shown above example 1.3

AddRemoveWhileIteratingUsingListIterator.java

package in.bench.resources.listiterator; import java.util.ArrayList; import java.util.ListIterator; public class AddRemoveWhileIteratingUsingListIterator < public static void main(String[] args) < // Fruits list ArrayListfruits = new ArrayList(); fruits.add("Melons"); fruits.add("Mango"); fruits.add("Apple"); fruits.add("Cherry"); fruits.add("Grapes"); // print to console System.out.println("Original Fruit List :- \n" + fruits); // iterate using Iterator ListIterator listIterator = fruits.listIterator(); // forward iterating while(listIterator.hasNext()) < if(listIterator.next().equalsIgnoreCase("Melons")) < // replace = remove Melons + add Banana listIterator.remove(); listIterator.add("Banana"); >> // print to console System.out.println("\nAfter removal of Melons & addition of Banana :- \n" + fruits); > >

Output:

Original Fruit List :- [Melons, Mango, Apple, Cherry, Grapes] After removal of Melons & addition of Banana :- [Banana, Mango, Apple, Cherry, Grapes]

References:

Happy Coding !!
Happy Learning !!

Читайте также:  Ev3 python примеры программ

Источник

Foreach java – подробное руководство

Метод forEach() был введен в Java 8. Он предоставляет программистам новый, краткий способ итерации по коллекции.

Метод forEach() выполняет заданное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение.

void forEach(Consumer action);

Это синтаксис метода forEach().

Потребительский интерфейс – это функциональный интерфейс (интерфейс с одним абстрактным методом), который принимает один ввод и не возвращает результата.

@FunctionalInterface public interface Consumer

Это определение потребительского интерфейса.

package com.zetcode; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class JavaForEachListConsumer < public static void main(String[] args) < List items = new ArrayList<>(); items.add("coins"); items.add("pens"); items.add("keys"); items.add("sheets"); items.forEach(new Consumer() < @Override public void accept(String name) < System.out.println(name); >>); > >

В этом примере мы перебираем список строк с помощью forEach(). Этот синтаксис можно сократить с помощью лямбда-выражения Java.

Лямбда-выражения используются в основном для определения встроенной реализации функционального интерфейса, то есть интерфейса только с одним методом. Лямбда-выражение создается с помощью лямбда-оператора.

package com.zetcode; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class JavaForEachListLambda < public static void main(String[] args) < List items = new ArrayList<>(); items.add("coins"); items.add("pens"); items.add("keys"); items.add("sheets"); items.forEach((String name) -> < System.out.println(name); >); > >

Вот тот же пример. Лямбда-выражение делает пример более кратким.

Java forEach на карте

В следующем примере на карте используется forEach().

package com.zetcode; import java.util.HashMap; import java.util.Map; public class JavaForEachMap < public static void main(String[] args) < Mapitems = new HashMap<>(); items.put("coins", 3); items.put("pens", 2); items.put("keys", 1); items.put("sheets", 12); items.forEach((k, v) -> < System.out.printf("%s : %d%n", k, v); >); > >

У нас есть карта пар строка / целое число. С помощью метода forEach() мы перебираем карту и печатаем ее пары ключ / значение.

В следующем примере мы явно показываем Consumer и Map.Entry в коде.

package com.zetcode; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; public class ForEachMap2 < public static void main(String[] args) < HashMapmap = new HashMap<>(); map.put("cups", 6); map.put("clocks", 2); map.put("pens", 12); Consumer action = entry -> < System.out.printf("key: %s", entry.getKey()); System.out.printf(" value: %s%n", entry.getValue()); >; map.entrySet().forEach(action); > >

В примере выполняется цикл для набора записей, который извлекается с помощью entrySet().

forEach в наборе

В следующем примере для набора используется forEach().

package com.zetcode; import java.util.HashSet; import java.util.Set; public class JavaForEachSet < public static void main(String[] args) < Set brands = new HashSet<>(); brands.add("Nike"); brands.add("IBM"); brands.add("Google"); brands.add("Apple"); brands.forEach((e) -> < System.out.println(e); >); > >

У нас есть набор струн. С помощью метода forEach() мы перебираем набор и выводим его значения.

Использование forEach в массиве

В следующем примере forEach() используется для массива.

package com.zetcode; import java.util.Arrays; public class JavaForEachArray < public static void main(String[] args) < int[] nums = < 3, 4, 2, 1, 6, 7 >; Arrays.stream(nums).forEach((e) -> < System.out.println(e); >); > >

В этом примере у нас есть массив целых чисел. Мы используем метод Arrays.stream() для преобразования массива в поток. Затем метод forEach() перебирает элементы и выводит их на консоль.

Фильтрация списка

Мы можем легко отфильтровать наши данные перед их просмотром с помощью forEach().

package com.zetcode; import java.util.ArrayList; import java.util.List; public class JavaForEachListFilter < public static void main(String[] args) < List items = new ArrayList<>(); items.add("coins"); items.add("pens"); items.add("keys"); items.add("sheets"); items.stream().filter(item -> (item.length() == 4)).forEach(System.out::println); > >

В этом примере мы фильтруем список строк и выводим отфильтрованный список на консоль. Отображаются только строки из четырех символов.

IntConsumer, LongConsumer, DoubleConsumer

Начиная с Java 8, у нас есть встроенные потребительские интерфейсы для примитивных типов данных: IntConsumer, LongConsumer и DoubleConsumer.

package com.zetcode; import java.util.Arrays; import java.util.function.DoubleConsumer; import java.util.function.IntConsumer; import java.util.function.LongConsumer; public class JavaForEachConsSpec < public static void main(String[] args) < int[] inums = < 3, 5, 6, 7, 5 >; IntConsumer icons = i -> System.out.print(i + " "); Arrays.stream(inums).forEach(icons); System.out.println(); long[] lnums = < 13L, 3L, 6L, 1L, 8L >; LongConsumer lcons = l -> System.out.print(l + " "); Arrays.stream(lnums).forEach(lcons); System.out.println(); double[] dnums = < 3.4d, 9d, 6.8d, 10.3d, 2.3d >; DoubleConsumer dcons = d -> System.out.print(d + " "); Arrays.stream(dnums).forEach(dcons); System.out.println(); > >

В этом примере мы создаем три типа потребителей и перебираем их с помощью forEach().

Обычный способ зациклить карту.

Map items = new HashMap<>(); items.put(«A», 10); items.put(«B», 20); items.put(«C», 30); items.put(«D», 40); items.put(«E», 50); items.put(«F», 60); for (Map.Entry entry : items.entrySet())

В Java 8 Вы можете зациклить карту с помощью forEach + лямбда-выражения.

Map items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60); items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v)); items.forEach((k,v)-> < System.out.println("Item : " + k + " Count : " + v); if("E".equals(k))< System.out.println("Hello E"); >>);

Нормальный цикл for в цикле список.

List items = new ArrayList<>(); items.add(«A»); items.add(«B»); items.add(«C»); items.add(«D»); items.add(«E»); for(String item : items)

В Java 8 вы можете зациклить список с помощью forEach + лямбда-выражения или ссылки на метод.

List items = new ArrayList<>(); items.add("A"); items.add("B"); items.add("C"); items.add("D"); items.add("E"); //lambda //Output : A,B,C,D,E items.forEach(item->System.out.println(item)); //Output : C items.forEach(item-> < if("C".equals(item))< System.out.println(item); >>); //method reference //Output : A,B,C,D,E items.forEach(System.out::println); //Stream and filter //Output : B items.stream() .filter(s->s.contains("B")) .forEach(System.out::println);

Средняя оценка 4.8 / 5. Количество голосов: 10

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Видим, что вы не нашли ответ на свой вопрос.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

Источник

Оцените статью