The collect()
method in Java’s Stream API is a powerful and flexible tool for transforming and aggregating data from streams. It plays a key role in handling data in a functional style, allowing you to accumulate elements from a stream into a desired data structure, such as a list, set, or map, or even to perform summary operations. Let’s explore how the collect()
method works, its common use cases, and provide examples to illustrate its capabilities.
collect()
Method?The collect()
method is a terminal operation in Java Streams. It processes each element in a stream, combining the elements into a summary result or mutable data structure. By default, Java provides the Collectors
utility class, which offers a variety of predefined collectors you can use with collect()
to achieve different tasks.
The general syntax of the collect()
method is as follows:
R collect(Collector super T, A, R> collector)
Here:
<R>
is the type of the result.Collector
is the functional interface that defines how to collect elements of type <T>
into a mutable result container of type <R>
.collect()
with ExamplesLet’s dive into some common use cases and examples to see how collect()
can be applied in different scenarios.
The most straightforward use of collect()
is to gather elements into a list. The Collectors.toList()
method helps you achieve this.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class CollectToListExample {
public static void main(String[] args) {
List names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List result = names.stream()
.filter(name -> name.length() > 3)
.collect(Collectors.toList());
System.out.println(result); // Output: [Alice, Charlie, David]
}
}
Here, we filter names longer than 3 characters and collect them into a List
.
If you need a unique collection of elements, you can use Collectors.toSet()
.
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
public class CollectToSetExample {
public static void main(String[] args) {
List numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
Set uniqueNumbers = numbers.stream()
.collect(Collectors.toSet());
System.out.println(uniqueNumbers); // Output: [1, 2, 3, 4, 5]
}
}
You can also collect elements into a Map
using Collectors.toMap()
. This is particularly useful for creating a map from a list of objects based on specific properties.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class CollectToMapExample {
public static void main(String[] args) {
List people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
Map nameToAgeMap = people.stream()
.collect(Collectors.toMap(Person::getName, Person::getAge));
System.out.println(nameToAgeMap); // Output: {Alice=30, Bob=25, Charlie=35}
}
}
In this case, we create a map where each person’s name is the key and their age is the value.
Grouping elements by a certain criterion is easy with Collectors.groupingBy()
. This is useful for tasks like categorizing data.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupingByExample {
public static void main(String[] args) {
List words = Arrays.asList("apple", "banana", "cherry", "apricot", "blueberry");
Map> wordsByInitial = words.stream()
.collect(Collectors.groupingBy(word -> word.charAt(0)));
System.out.println(wordsByInitial);
// Output: {a=[apple, apricot], b=[banana, blueberry], c=[cherry]}
}
}
Here, we group words by their initial letter.
Partitioning is a specialized form of grouping where elements are divided into two groups based on a predicate. You can achieve this with Collectors.partitioningBy()
.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class PartitioningByExample {
public static void main(String[] args) {
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Map> partitionedByEven = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println(partitionedByEven);
// Output: {false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8]}
}
}
In this example, numbers are partitioned into even and odd categories.
The collect()
method in Java Streams, especially with the support of Collectors
, is incredibly versatile. Whether you need to transform, aggregate, or categorize your data, collect()
provides a streamlined and functional way to achieve your goal. By understanding the power of collect()
, you can leverage Java Streams more effectively in your code, making your data processing tasks simpler and more readable.