Java 8 forEach

Java 8 provides a new method forEach() to iterate the elements. It is defined in Iterable and Stream interface.
It is a default method defined in the Iterable interface. Collection classes which extend Iterable interface can use forEach() loop to iterate elements.
In this post, we will learn how to forEach() method to iterate over collections, map and stream.

1. forEach() method with List

Let's use normal for-loop to loop a List.
public static void forEachWithList() {

    final List < Person > items = new ArrayList < > ();
    items.add(new Person(100, "Ramesh"));
    items.add(new Person(100, "A"));
    items.add(new Person(100, "B"));
    items.add(new Person(100, "C"));
    items.add(new Person(100, "D"));

    for (final Person item: items) {
        System.out.println(item.getName());
    }
}
In Java 8, you can loop a List with forEach + lambda expression or method reference.
public static void forEachWithList() {

    final List < Person > items = new ArrayList < > ();
    items.add(new Person(100, "Ramesh"));
    items.add(new Person(100, "A"));
    items.add(new Person(100, "B"));
    items.add(new Person(100, "C"));
    items.add(new Person(100, "D"));

    //lambda
    items.forEach(item - > System.out.println(item.getName()));

    //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.getName().equals("Ramesh"))
        .forEach(System.out::println);
}
Please refer the comments in above example are self descriptive.

2. forEach() method with Map

Let's first see the normal way to loop a Map using for-each loop.
public static void forEachWithMap() {

    // Before Java 8, how to loop map
    final Map < Integer, Person > map = new HashMap < > ();
    map.put(1, new Person(100, "Ramesh"));
    map.put(2, new Person(100, "Ram"));
    map.put(3, new Person(100, "Prakash"));
    map.put(4, new Person(100, "Amir"));
    map.put(5, new Person(100, "Sharuk"));

    for (final Entry < Integer, Person > entry: map.entrySet()) {
        System.out.println(entry.getKey());
        System.out.println(entry.getValue().getName());
    }
}
In Java 8, you can loop a Map with forEach and lambda expressions.
public static void forEachWithMap() {

    // Before Java 8, how to loop map
    final Map < Integer, Person > map = new HashMap < > ();
    map.put(1, new Person(100, "Ramesh"));
    map.put(2, new Person(100, "Ram"));
    map.put(3, new Person(100, "Prakash"));
    map.put(4, new Person(100, "Amir"));
    map.put(5, new Person(100, "Sharuk"));

    //  In Java 8, you can loop a Map with forEach + lambda expression.
    map.forEach((k, p) - > {
        System.out.println(k);
        System.out.println(p.getName());
    });
}

3. forEach() method with Set

Below example shows how to use forEach method with collections, stream etc.
public static void forEachWithSet() {

    final Set < String > items = new HashSet < > ();
    items.add("A");
    items.add("B");
    items.add("C");
    items.add("D");
    items.add("E");

    // before java 8
    for (final String item: items) {
        System.out.println(item);
    }

    // java 8 with lambda expression
    //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
    items.forEach(System.out::println);

    //Stream and filter
    items.stream()
        .filter(s - > s.contains("B"))
        .forEach(System.out::println);

}

Real World Examples

In real projects, we can use forEach() method to loop over Java Classes.
Let's create Entity class and EntityDTO class, loop over list of entities and convert from Entity to EntityDTO using forEach() method.
Let's demonstrates the usage of Java 8 forEach() method real projects:
package com.ramesh.corejava.devguide.java8;

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

public class ForEachRealTimeExamples {

    public static void main(String[] args) {
        List < Entity > entities = getEntities();

        List < EntityDTO > dtos = new ArrayList < > ();
        entities.forEach(entity - > {
            dtos.add(new EntityDTO(entity.getId(), entity.getEntityName()));
        });

        dtos.forEach(e - > {
            System.out.println(e.getId());
            System.out.println(e.getEntityName());
        });

    }

    public static List < Entity > getEntities() {
        List < Entity > entities = new ArrayList < > ();
        entities.add(new Entity(100, "entity 1"));
        entities.add(new Entity(100, "entity 2"));
        entities.add(new Entity(100, "entity 3"));
        return entities;
    }
}

class EntityDTO {
    private int id;
    private String entityName;
    private Date createdAt;
    private String createBy;
    private Date updatedAt;
    private String updatedBy;

    public EntityDTO(int id, String entityName) {
        this.id = id;
        this.entityName = entityName;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEntityName() {
        return entityName;
    }
    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }
    public Date getCreatedAt() {
        return createdAt;
    }
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }
    public String getCreateBy() {
        return createBy;
    }
    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }
    public Date getUpdatedAt() {
        return updatedAt;
    }
    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }
    public String getUpdatedBy() {
        return updatedBy;
    }
    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
}

class Entity {
    private int id;
    private String entityName;
    private Date createdAt;
    private String createBy;
    private Date updatedAt;
    private String updatedBy;

    public Entity(int id, String entityName) {
        super();
        this.id = id;
        this.entityName = entityName;
        this.createdAt = new Date();
        this.createBy = "ramesh";
        this.updatedAt = new Date();
        this.updatedBy = "ramesh";
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getEntityName() {
        return entityName;
    }
    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }
    public Date getCreatedAt() {
        return createdAt;
    }
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }
    public String getCreateBy() {
        return createBy;
    }
    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }
    public Date getUpdatedAt() {
        return updatedAt;
    }
    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }
    public String getUpdatedBy() {
        return updatedBy;
    }
    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
}
The source code of this post is available on GitHub Repository.

5. Related Java 8 Top Posts

  1. Java 8 Lambda Expressions
  2. Java 8 Functional Interfaces
  3. Java 8 Method References
  4. Java 8 Stream API
  5. Java 8 Optional Class
  6. Java 8 Collectors Class
  7. Java 8 StringJoiner Class
  8. Java 8 Static and Default Methods in Interface
  9. Guide to Java 8 forEach Method
  10. Handle NullPointerException using Java 8 Optional Class
  11. How to Use Java 8 Stream API in Java Projects
  12. Migrating Source Code to Java 8

Comments