Collectors in Java 8
Overview
The Collectors
utility class in Java 8 provides various implementations of the Collector
interface. These collectors can be used to collect stream elements into collections, aggregate values, and perform various other reduction operations. The Collectors
class provides several predefined collector implementations for most common operations.
Common Collectors
Some of the most commonly used collectors are:
toList()
: Collects elements into aList
.toSet()
: Collects elements into aSet
.toMap()
: Collects elements into aMap
.joining()
: Concatenates elements into aString
.counting()
: Counts the number of elements.summarizingInt()
,summarizingDouble()
,summarizingLong()
: Collects statistics such as count, sum, min, average, and max.groupingBy()
: Groups elements by a classifier function.partitioningBy()
: Partitions elements based on a predicate.
Example: Collecting to List and Set
import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "orange", "apple"); // Collecting to List List resultList = list.stream() .collect(Collectors.toList()); System.out.println("List: " + resultList); // Collecting to Set Set resultSet = list.stream() .collect(Collectors.toSet()); System.out.println("Set: " + resultSet); } }
Example: Collecting to Map
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "orange"); // Collecting to Map Map resultMap = list.stream() .collect(Collectors.toMap( fruit -> fruit, fruit -> fruit.length() )); resultMap.forEach((k, v) -> System.out.println(k + ": " + v)); } }
Example: Joining Strings
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "orange"); // Joining strings String result = list.stream() .collect(Collectors.joining(", ")); System.out.println("Joined: " + result); } }
Example: Counting Elements
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "orange"); // Counting elements long count = list.stream() .collect(Collectors.counting()); System.out.println("Count: " + count); } }
Example: Summarizing Statistics
import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList(1, 2, 3, 4, 5, 6); // Summarizing statistics IntSummaryStatistics stats = list.stream() .collect(Collectors.summarizingInt(Integer::intValue)); System.out.println("Count: " + stats.getCount()); System.out.println("Sum: " + stats.getSum()); System.out.println("Min: " + stats.getMin()); System.out.println("Average: " + stats.getAverage()); System.out.println("Max: " + stats.getMax()); } }
Example: Grouping Elements
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "orange", "blueberry", "blackberry"); // Grouping by first letter Map > groupedByFirstLetter = list.stream() .collect(Collectors.groupingBy(fruit -> fruit.charAt(0))); groupedByFirstLetter.forEach((k, v) -> System.out.println(k + ": " + v)); } }
Example: Partitioning Elements
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "orange", "blueberry", "blackberry"); // Partitioning by length Map > partitionedByLength = list.stream() .collect(Collectors.partitioningBy(fruit -> fruit.length() > 5)); partitionedByLength.forEach((k, v) -> System.out.println(k + ": " + v)); } }
Conclusion
The Collectors
utility class in Java 8 provides powerful and flexible ways to collect stream elements. Whether you need to collect elements into collections, aggregate values, or group and partition data, Collectors
offers a comprehensive set of tools to perform these operations efficiently and concisely.