Intermediate and Terminal Operations

Java 8 Streams provide a powerful API for processing sequences of elements. Stream operations are divided into two categories: intermediate and terminal operations. Intermediate operations transform a stream and return another stream, allowing multiple operations to be chained together. Terminal operations produce a result or side-effect and complete the stream pipeline.

Intermediate Operations:

Intermediate operations return a new stream and are lazy, meaning they are not executed until a terminal operation is invoked.

Operation Syntax Description Example
filter() stream.filter(predicate) Filters elements based on a condition list.stream().filter(x -> x > 10)
map() stream.map(function) Transforms each element into another form list.stream().map(String::toUpperCase)
flatMap() stream.flatMap(function) Flattens a stream of streams into a single stream list.stream().flatMap(Collection::stream)
distinct() stream.distinct() Removes duplicate elements from the stream list.stream().distinct()
sorted() stream.sorted() Sorts elements in natural order list.stream().sorted()
sorted() stream.sorted(comparator) Sorts elements using a custom comparator list.stream().sorted((a, b) -> b - a)
peek() stream.peek(consumer) Performs an action on each element (used for debugging) stream.peek(System.out::println)
limit() stream.limit(n) Truncates the stream to the first n elements list.stream().limit(5)
skip() stream.skip(n) Skips the first n elements list.stream().skip(2)
mapToInt() stream.mapToInt(ToIntFunction) Converts stream to IntStream list.stream().mapToInt(String::length)
mapToDouble() stream.mapToDouble(ToDoubleFunction) Converts stream to DoubleStream list.stream().mapToDouble(Double::parseDouble)
mapToLong() stream.mapToLong(ToLongFunction) Converts stream to LongStream list.stream().mapToLong(Long::parseLong)
boxed() intStream.boxed() Converts primitive stream to Stream of wrapper objects IntStream.range(1, 5).boxed()
import java.util.*;
import java.util.stream.*;

public class StreamIntermediateExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList(
            "Mahesh", "Paani", "Datta", "Mahesh", "Harsha", "Ganesh", "Ravi", "Maheshwar", "Ravi"
        );

        List<String> processedNames = names.stream()
            .filter(name -> name.length() > 5)                  // Keep names longer than 5 characters
            .distinct()                                         // Remove duplicates
            .sorted()                                           // Sort alphabetically
            .peek(name -> System.out.println("Filtered: " + name)) // Debugging
            .map(String::toUpperCase)                           // Convert to uppercase
            .limit(5)                                           // Take first 5
            .skip(1)                                            // Skip the first of those
            .collect(Collectors.toList());                      // Collect result into a List

        System.out.println("\nFinal Processed Names:");
        processedNames.forEach(System.out::println);
    }
}

/*
D:\java8streams>javac  StreamIntermediateExample.java

D:\java8streams>java  StreamIntermediateExample
Filtered: Ganesh
Filtered: Harsha
Filtered: Mahesh
Filtered: Maheshwar

Final Processed Names:
HARSHA
MAHESH
MAHESHWAR
*/
Scroll to Top