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

Как работает цикл “forEach” в Java?

В Java 8 появилось множество функций, и метод forEach() является одной из них. Короче говоря, это способ… С пометкой java, программирование, учебное пособие.

В Java 8 появилось множество функций, и метод forEach() является одной из них.

Короче говоря, это способ перебора коллекции (например, карты, набора или списка) или Потока .

forEach() принимает только один параметр, который является функциональным интерфейсом . Это означает, что вы можете использовать лямбда-выражение в качестве аргумента.

Давайте рассмотрим несколько примеров, чтобы понять, как forEach() работает с коллекциями и потоками.

FOREACH() В СПИСКЕ

import java.util.ArrayList;
import java.util.List;

public class Fruit {

    public static void main(String[] args) {

        List listOfFruits = new ArrayList<>();
        listOfFruits.add("apple");
        listOfFruits.add("pear");
        listOfFruits.add("banana");
        listOfFruits.add("mango");

        //using a lambda expression
        listOfFruits.forEach(x -> System.out.println(x));

        //using a method reference
        listOfFruits.forEach(System.out::println);

    }
}

Результат в обоих случаях таков:

apple
pear
banana
mango

В приведенном выше фрагменте кода мы:

  • Создание списка с именем список Фруктов .
  • Добавление элементов в список.
  • Перебор элементов и их печать с использованием лямбда-выражения или ссылки на метод.

FOREACH() НА КАРТЕ

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Fruit {

    public static void main(String[] args) {

        Map mapOfFruits = new HashMap<>();
        mapOfFruits.put(1, "apple");
        mapOfFruits.put(2, "pear");
        mapOfFruits.put(3, "banana");
        mapOfFruits.put(4, "mango");

        mapOfFruits.forEach((x, y) -> System.out.println(x + " " + y));

    }
}

Результатом является:

1 apple
2 pear
3 banana
4 mango

В приведенном выше фрагменте кода мы:

  • Создание карты фруктов с целым числом в качестве ключа и строкой в качестве значения.
  • Заполнение карты различными фруктами. Например, ключ 1 связан с apple. И так далее.
  • Перебор элементов и печать их ключей и значений с использованием лямбда-выражения.

FOREACH() НА МНОЖЕСТВЕ

import java.util.HashSet;
import java.util.Set;

public class Fruit {

    public static void main(String[] args) {

        Set setOfFruits = new HashSet<>();

        setOfFruits.add("apple");
        setOfFruits.add("pear");
        setOfFruits.add("banana");
        setOfFruits.add("mango");

        setOfFruits.forEach(x -> System.out.println(x));

    }
}

Результатом является:

banana
apple
pear
mango

В приведенном выше фрагменте кода мы:

  • Создание набора Фруктов .
  • Добавление фруктов в набор.
  • Перебираем элементы и печатаем их с помощью лямбда-выражения.

ПРИМЕЧАНИЕ : набор не гарантирует никакого порядка. Кроме того, он не принимает дубликаты. Если вы попытаетесь добавить еще один “mango”, вы не получите никакой ошибки компиляции, но он не распечатает второй “mango”.

FOREACH() НА РУЧЬЕ

import java.util.ArrayList;
import java.util.List;

public class Fruit {

    public static void main(String[] args) {

        List listOfFruits = new ArrayList<>();
        listOfFruits.add("apple");
        listOfFruits.add("pear");
        listOfFruits.add("banana");
        listOfFruits.add("mango");

        listOfFruits.stream()
                .forEach(x -> System.out.println(x));
    }
}

FOREACH() ДЛЯ ПЕЧАТИ ОТФИЛЬТРОВАННОГО СПИСКА ЭЛЕМЕНТОВ

import java.util.ArrayList;
import java.util.List;

public class Fruit {

    public static void main(String[] args) {

        List listOfFruits = new ArrayList<>();
        listOfFruits.add("apple");
        listOfFruits.add("pear");
        listOfFruits.add("banana");
        listOfFruits.add("mango");

        listOfFruits.stream()
                .filter(x -> x.length() == 5)
                .forEach(x -> System.out.println(x));
    }
}

Результатом является:

apple
mango

В приведенном выше фрагменте кода мы:

  • Создание список Фруктов .
  • Добавление фруктов в список.
  • Использование Stream API для фильтрации тех фруктов, длина которых равна 5.
  • Перебор отфильтрованного списка и печать элементов с использованием лямбда-выражения.

FOREACH() против FOREACHORDERED()

Если вы хотите убедиться, что элементы печатаются по порядку, вы можете использовать метод forEachOrdered() . Этот метод представляет собой терминальный оператор . Функция forEach() всегда выполняется в конце потока, потому что после ее выполнения возвращать нечего. То же самое относится и к методу forEachOrdered().

Давайте рассмотрим пример, чтобы лучше понять это:

import java.util.Arrays;
import java.util.List;

public class Fruit {

    public static void main(String[] args) {

        List listOfFruits = Arrays.asList("apple", "mango", "pear", "banana");

        //using forEach()
        listOfFruits.stream().parallel().forEach(System.out::println);
        System.out.println("-------------------");
        // using forEachOrdered()
        listOfFruits.stream().parallel().forEachOrdered(System.out::println);

    }
}

Результатом является:

pear
banana
apple
mango
-------------------
apple
mango
pear
banana

В ЧЕМ РАЗНИЦА МЕЖДУ FOREACH() И FOREACHORDERED()?

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

КАКОВЫ ПРЕИМУЩЕСТВА ИСПОЛЬЗОВАНИЯ ЦИКЛА FOREACH()?

Код более удобочитаем : если вы сравните forEach() с обычным циклом for, forEach() более удобочитаем и лаконичен, потому что вам не нужно объявлять инициализацию, условие и приращение или уменьшение.

В нем нет ошибок .

Я надеюсь, что вы нашли эту статью полезной! До следующего раза. 😊

Оригинал: “https://dev.to/maddy/how-does-the-foreach-loop-work-in-java-131o”