How Do You Collect Results from a Stream into a List in Java?

How Do You Collect Results from a Stream into a List in Java?

Introduction

In Java, the Stream API introduced in Java 8 allows for more functional-style data processing. One of the most common operations when working with streams is to collect the results into a collection such as a List, Set, or Map. The collect() method is used for this purpose and is part of the Stream class.

This guide will focus on how to collect results from a stream into a List in Java. We will explore the Collectors.toList() method, which is the simplest way to collect stream elements into a list. We’ll also look at various examples to demonstrate how the stream operations can be applied effectively in different scenarios.

The Basics of Collecting Results in Java Streams

To collect results from a stream, you use the collect() method, which is a terminal operation in the Stream API. The collect() method requires a Collector as an argument. The Collector provides various predefined methods, such as toList(), toSet(), and joining(), that allow you to collect the elements of a stream into different types of collections.

In this case, we are particularly interested in the toList() collector, which gathers the stream elements into a List. Here’s the basic syntax for collecting results into a list:

Syntax of Collecting Results into a List


List result = stream.collect(Collectors.toList());

        

The above line of code collects the results of a stream into a List of type T, where T is the type of elements in the stream.

Simple Example: Collecting Stream Results into a List

Let’s start with a simple example to understand how we can collect stream results into a List.

Example 1: Collecting Integers into a List


import java.util.*;
import java.util.stream.*;

public class StreamToListExample {
    public static void main(String[] args) {
        // A list of integers
        List numbers = Arrays.asList(1, 2, 3, 4, 5);

        // Collecting the stream results into a List
        List squaredNumbers = numbers.stream()
                                              .map(n -> n * n)
                                              .collect(Collectors.toList());

        // Print the squared numbers
        System.out.println(squaredNumbers);  // Output: [1, 4, 9, 16, 25]
    }
}

        

In this example, we start with a list of integers. We create a stream from the list, then use the map() method to square each number. Finally, we use collect(Collectors.toList()) to gather the results into a List of squared numbers.

Advanced Example: Collecting Results After Filtering and Mapping

In more complex scenarios, you may want to perform multiple operations on the stream, such as filtering or mapping, before collecting the results. The collect() method can be combined with other stream operations to filter or transform the data before collecting it.

Example 2: Filtering and Collecting Strings into a List


import java.util.*;
import java.util.stream.*;

public class FilterAndCollectExample {
    public static void main(String[] args) {
        List words = Arrays.asList("Java", "Stream", "Lambda", "Functional", "Programming");

        // Filter words with more than 5 characters and collect them into a List
        List longWords = words.stream()
                                      .filter(word -> word.length() > 5)
                                      .collect(Collectors.toList());

        // Print the long words
        System.out.println(longWords);  // Output: [Stream, Lambda, Functional, Programming]
    }
}

        

In this example, we start with a list of words. We filter out words that are longer than 5 characters, and then collect the remaining words into a list using the collect(Collectors.toList()) method.

Using Collectors.toList() for Complex Transformations

You can also chain multiple stream operations such as filtering, mapping, sorting, and then collect the results into a List. The Stream API provides a fluent interface that allows you to apply multiple transformations before collecting the results.

Example 3: Sorting and Collecting Results


import java.util.*;
import java.util.stream.*;

public class SortingAndCollectExample {
    public static void main(String[] args) {
        List words = Arrays.asList("Java", "Stream", "Lambda", "Functional", "Programming");

        // Sort the words in alphabetical order and collect them into a List
        List sortedWords = words.stream()
                                        .sorted()
                                        .collect(Collectors.toList());

        // Print the sorted words
        System.out.println(sortedWords);  // Output: [Functional, Java, Lambda, Programming, Stream]
    }
}

        

In this example, we sort the words alphabetically using the sorted() method and collect the sorted results into a list. The result is a list of words in alphabetical order.

Performance Considerations

While using the collect() method with Collectors.toList() is straightforward and efficient for most scenarios, it’s important to consider the performance implications when dealing with large collections. For instance, the stream pipeline may perform additional operations such as filtering or sorting, which can impact the performance of the program.

When working with very large datasets, consider using parallel streams to take advantage of multiple processors and improve performance. You can create a parallel stream by calling the parallelStream() method on the collection:

Example 4: Using Parallel Streams for Performance


import java.util.*;
import java.util.stream.*;

public class ParallelStreamExample {
    public static void main(String[] args) {
        List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // Using parallel stream to square the numbers
        List squaredNumbers = numbers.parallelStream()
                                              .map(n -> n * n)
                                              .collect(Collectors.toList());

        // Print the squared numbers
        System.out.println(squaredNumbers);  // Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    }
}

        

In this example, we use a parallel stream to square the numbers in the list. The use of parallel streams can be helpful when working with large datasets, but it’s important to measure performance to ensure it’s beneficial for your specific use case.

Conclusion

Collecting results from a stream into a List is one of the most common and useful operations in Java when processing collections of data. By leveraging the collect() method with Collectors.toList(), you can efficiently transform and gather elements from a stream into a list.

In this guide, we’ve explored how to collect results from a stream using basic and advanced examples, as well as performance considerations when using streams with large datasets. The Stream API is a powerful tool that enables developers to write cleaner, more readable, and more efficient code when handling collections.

© 2025 Tech Interview Guide. All Rights Reserved.

Please follow and like us:

Leave a Comment