Перейти к контенту

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

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

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

 

void forEach(Consumer<? super T> action);

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

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

@FunctionalInterface
public interface Consumer {
    void accept(T t);
}

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

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) {

        Map<String, Integer> items = 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) {

        HashMap<String, Integer> map = new HashMap<>();

        map.put("cups", 6);
        map.put("clocks", 2);
        map.put("pens", 12);

        Consumer<Map.Entry<String, Integer>> 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<String, Integer> 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<String, Integer> entry : items.entrySet()) {
	System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue());
}

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

Map<String, Integer> 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){
	System.out.println(item);
}

В 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);

Оцени статью

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

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

Или поделись статьей

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

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)