Рубрики
Без рубрики

Java для каждого – Java 8 для каждого

Пример Java для каждого, Пример Java 8 для каждого, Список Java 8 для каждого, Список массивов, Карта, Параллельный поток, java для каждого итеративного, потребительского, двоичного действия

Автор оригинала: Pankaj Kumar.

Java для каждого метода была введена в итерационный интерфейс в Java 8 . Метод Java 8 forEach-это еще один способ, который мы можем использовать для обхода коллекции.

Java для каждого

Ниже фрагмент кода показывает реализацию метода java forEach по умолчанию в итерационном интерфейсе. Прочитайте изменения интерфейса java 8, чтобы узнать больше о методах интерфейса по умолчанию.

default void forEach(Consumer action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

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

Пример списка Java 8 для каждого

До java 8 мы могли перебирать список с помощью цикла for или итератора .

List list = 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
Consumer action = 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 мы перебирали элементы карты, как показано ниже.

Map map = 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 action) {
        Objects.requireNonNull(action);
        for (Map.Entry entry : 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 для каждого с картой.

BiConsumer action = 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 Stream parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }

Поэтому, если нам нужно выполнить итерацию по коллекции, и нас не беспокоит последовательная итерация, мы можем использовать параллельный поток с циклом forEach, как показано ниже.

//parallel operation using stream
list.parallelStream().forEach(action);

Это все для метода Java forEach. Я надеюсь, что вы найдете какой-нибудь вариант использования метода java 8 forEach при параллельной обработке.