Автор оригинала: Pankaj Kumar.
Java для каждого метода была введена в итерационный интерфейс в Java 8 . Метод Java 8 forEach-это еще один способ, который мы можем использовать для обхода коллекции.
Java для каждого
Ниже фрагмент кода показывает реализацию метода java forEach по умолчанию в итерационном интерфейсе. Прочитайте изменения интерфейса java 8, чтобы узнать больше о методах интерфейса по умолчанию.
default void forEach(Consumer super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
Java для каждого метода выполняет заданное действие для каждого элемента итерации до тех пор, пока все элементы не будут обработаны или не возникнет исключение.
Пример списка Java 8 для каждого
До java 8 мы могли перебирать список с помощью цикла for или итератора .
Listlist = getList(); //prior to java 8 //using enhanced for loop for(String s : list){ System.out.println(s); } //using iterator Iterator it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); }
Теперь то же самое можно выполнить с помощью метода java forEach, как показано ниже.
// Create Consumer instance Consumeraction = new Consumer (){ @Override public void accept(String t) { System.out.println(t); } }; //java 8 forEach list.forEach(action);
Поскольку Потребитель является функциональным интерфейсом , мы можем использовать лямбда-выражение и написать приведенный выше код в одной строке как;
list.forEach(k -> {System.out.println(k);});
Пример Java 8 Для каждой карты
До java 8 мы перебирали элементы карты, как показано ниже.
Mapmap = getMap(); //iteration prior to java 8 Set keySet = map.keySet(); //using enhanced for loop for (Integer i : keySet){ System.out.println(map.get(i)); } //using iterator Iterator it = keySet.iterator(); while(it.hasNext()){ System.out.println(map.get(it.next())); }
Поскольку Map не расширяет возможности итерации, метод forEach добавляется в интерфейс Map в java 8, и ниже показана реализация по умолчанию.
default void forEach(BiConsumer super K, ? super V> action) { Objects.requireNonNull(action); for (Map.Entryentry : entrySet()) { K k; V v; try { k = entry.getKey(); v = entry.getValue(); } catch(IllegalStateException ise) { // this usually means the entry is no longer in the map. throw new ConcurrentModificationException(ise); } action.accept(k, v); } }
Давайте рассмотрим простой пример того, как мы можем использовать java 8 для каждого с картой.
BiConsumeraction = new BiConsumer (){ @Override public void accept(Integer t, String u) { System.out.println(u); } }; //java 8 forEach with Map map.forEach(action);
Тот же код может быть написан с использованием лямбда – выражений, как показано ниже.
map.forEach((k,v) -> {System.out.println(v);});
Преимущества Java для каждого
Я не вижу слишком большой пользы в цикле forEach, за исключением случаев, когда вы используете его с параллельным потоком. В интерфейсе сбора был добавлен новый метод для получения параллельного потока.
default StreamparallelStream() { return StreamSupport.stream(spliterator(), true); }
Поэтому, если нам нужно выполнить итерацию по коллекции, и нас не беспокоит последовательная итерация, мы можем использовать параллельный поток с циклом forEach, как показано ниже.
//parallel operation using stream list.parallelStream().forEach(action);
Это все для метода Java forEach. Я надеюсь, что вы найдете какой-нибудь вариант использования метода java 8 forEach при параллельной обработке.