Learnitweb

Java 8 forEach with examples

Java 8 provides a new method forEach in Iterable and Stream interfaces to iterate elements. forEach provides a new way of iterating elements. Classes which implement Iterable interface can use this method to iterate elements.

Syntax

1. Syntax of forEach in Iterable

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

2. Syntax of forEach in Stream

void forEach(Consumer<? super T> action)

Official documentation states the following about forEach:

Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception.

  • forEach method in Iterable interface is a default method.
  • This method takes a single parameter of Consumer type. Consumer is a functional interface. Consumer represents an operation that accepts a single input argument and returns no result.
@FunctionalInterface
public interface Consumer {
    void accept(T t);
}

Note: Enhanced for loop is an external iterator whereas forEach is an internal iterator. In external iterator, client code controls the iteration. In internal iterator, iterator itself controls the iteration.

Let us compare the way of iterating a list of strings using enhanced for loop and forEach method.

Iteration using enhanced for loop

Before looking into forEach example to iterate, let us first see an example of for loop. We can use the enhanced for loop to iterate the list.

for (String element : listOfStrings) {
    System.out.println(element);
}

Using forEach method in Java 8

Following is a simple piece of code to iterate collection of strings using forEach:

listOfStrings.forEach(element -> System.out.println(element));

forEach method takes a Consumer as a parameter. We can create a Consumer and then pass it to forEach.

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ForEachExample {
    public static void main(String[] args) {
    	//Create a list for demo purpose
    	List<String> listOfStrings = Arrays.asList("one","two","three","four");
    	
    	//Consumer which prints elements
    	Consumer<String> consumerToPrint = new Consumer<String>() {
			@Override
			public void accept(String t) {
				System.out.println("element: " + t);
			}
    		
    	};   
    	
    	//using forEach to iterate elements
    	listOfStrings.forEach(consumerToPrint);
    }
}

Output

element: one
element: two
element: three
element: four

Since, consumer is a functional interface, we can pass Consumer as a lambda expression.

Consumer<String> consumerToPrint = (String t) -> {
    System.out.println("element: " + t);
};

We can use a method reference if a method already exists whose functionality can be used. In our example, since we are printing elements we can do the following:

listOfStrings.forEach(System.out::println);

Examples of forEach

Example 1: Iterating a list using forEach

In this example we are iterating a list in Java using forEach method.

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

public class ForEachExample {
    public static void main(String[] args) {
    	//Create a list for demo purpose
    	List<String> listOfStrings = Arrays.asList("one","two","three","four");
    	
    	//using forEach to iterate elements
    	listOfStrings.forEach(System.out::println);
    }
}

Output

one
two
three
four

Example 2: Iterating a map using forEach

In this example we are iterating a map in Java using forEach method.

import java.util.HashMap;
import java.util.Map;

public class ForEachExample {
    public static void main(String[] args) {
    	//Create a map for demo purpose
    	Map<Integer, String> days = new HashMap();
    	
    	days.put(1, "Sunday");
    	days.put(2, "Monday");
    	days.put(3, "Tuesday");
    	days.put(4, "Wednesday");
    	
    	//using forEach to iterate elements of map
    	days.forEach((key,value)-> System.out.println(key+" - "+value));
    }
}

Output

1 - Sunday
2 - Monday
3 - Tuesday
4 - Wednesday

Example 3: Iterating a Stream using forEach

In this example we are iterating a Stream in Java using forEach method.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class ForEachExample {
    public static void main(String[] args) {
    	//Create a list for demo purpose
    	List<String> listOfStrings = Arrays.asList("one","two","three","four");
    	
    	//Create a stream from list for demo 
    	
    	Stream<String> stream = listOfStrings.stream();
    	
    	//using forEach to iterate elements
    	stream.forEach(System.out::println);
    }
}

Output

one
two
three
four