Stream Operations
Stream Collect
After filtering and transforming stream elements, you typically need to gather results into a collection or compute aggregate values. The collect operation provides flexible, efficient ways to accumulate stream results.
Basic Collectors
The collect operation is a terminal operation that uses a Collector to gather elements.
The Collectors utility class provides common collectors for lists, sets, and maps.
import java.util.*;
import java.util.stream.*;
public class Basic {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "apple", "cherry", "banana");
List<String> list = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println("list: " + list);
Set<String> set = words.stream().collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println("set: " + set);
List<String> items = Arrays.asList("a", "bb", "ccc");
Map<String, Integer> lengths = items.stream()
.collect(Collectors.toMap(s -> s, String::length, (a, b) -> a, LinkedHashMap::new));
System.out.println("lengths: " + lengths);
}
}
import java.util.*;
import java.util.stream.*;
public class Basic {
public static void main(String[] args) {
List<String> words = Arrays.asList("red", "blue", "red", "green");
List<String> list = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println("list: " + list);
Set<String> set = words.stream().collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println("set: " + set);
List<String> items = Arrays.asList("a", "bb", "ccc");
Map<String, Integer> lengths = items.stream()
.collect(Collectors.toMap(s -> s, String::length, (a, b) -> a, LinkedHashMap::new));
System.out.println("lengths: " + lengths);
}
}
import java.util.*;
import java.util.stream.*;
public class Basic {
public static void main(String[] args) {
List<String> words = Arrays.asList("java", "stream");
List<String> list = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println("list: " + list);
Set<String> set = words.stream().collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println("set: " + set);
List<String> items = Arrays.asList("a", "bb", "ccc");
Map<String, Integer> lengths = items.stream()
.collect(Collectors.toMap(s -> s, String::length, (a, b) -> a, LinkedHashMap::new));
System.out.println("lengths: " + lengths);
}
}
words ← [apple, banana, apple, cherry, banana], list ← [APPLE, BANANA, APPLE, CHERRY, BANANA]
4public class Basic {5 public static void main(String[] args) {6 List<String> words→ [apple, banana, apple, cherry, banana] = Arrays.asList("apple", "banana", "apple", "cherry", "banana"); //@words=Arrays.asList("apple", "banana", "apple", "cherry", "banana"), Arrays.asList("red", "blue", "red", "green"), Arrays.asList("java", "stream")78 List<String> list→ [APPLE, BANANA, APPLE, CHERRY, BANANA] = words.stream()9 .map(String::toUpperCase)10 .collect(Collectors.toList());11 System.out.println("list: " + list[APPLE, BANANA, APPLE, CHERRY, BANANA]);1213 Set<String> set→ [apple, banana, cherry] = words.stream().collect(Collectors.toCollection(LinkedHashSet::new));14 System.out.println("set: " + set[apple, banana, cherry]);1516 List<String> items→ [a, bb, ccc] = Arrays.asList("a", "bb", "ccc");17 Map<String, Integer> lengths→ {a=1, bb=2, ccc=3} = items.stream()18 .collect(Collectors.toMap(s -> s, String::length, (a, b) -> a, LinkedHashMap::new));19 System.out.println("lengths: " + lengths{a=1, bb=2, ccc=3});outputlist: [APPLE, BANANA, APPLE, CHERRY, BANANA] set: [apple, banana, cherry] lengths: {a=1, bb=2, ccc=3}
words ← [red, blue, red, green], list ← [RED, BLUE, RED, GREEN]
4public class Basic {5 public static void main(String[] args) {6 List<String> words→ [red, blue, red, green] = Arrays.asList("red", "blue", "red", "green");78 List<String> list→ [RED, BLUE, RED, GREEN] = words.stream()9 .map(String::toUpperCase)10 .collect(Collectors.toList());11 System.out.println("list: " + list[RED, BLUE, RED, GREEN]);1213 Set<String> set→ [red, blue, green] = words.stream().collect(Collectors.toCollection(LinkedHashSet::new));14 System.out.println("set: " + set[red, blue, green]);1516 List<String> items→ [a, bb, ccc] = Arrays.asList("a", "bb", "ccc");17 Map<String, Integer> lengths→ {a=1, bb=2, ccc=3} = items.stream()18 .collect(Collectors.toMap(s -> s, String::length, (a, b) -> a, LinkedHashMap::new));19 System.out.println("lengths: " + lengths{a=1, bb=2, ccc=3});outputlist: [RED, BLUE, RED, GREEN] set: [red, blue, green] lengths: {a=1, bb=2, ccc=3}
words ← [java, stream], list ← [JAVA, STREAM], set ← [java, stream]
4public class Basic {5 public static void main(String[] args) {6 List<String> words→ [java, stream] = Arrays.asList("java", "stream");78 List<String> list→ [JAVA, STREAM] = words.stream()9 .map(String::toUpperCase)10 .collect(Collectors.toList());11 System.out.println("list: " + list[JAVA, STREAM]);1213 Set<String> set→ [java, stream] = words.stream().collect(Collectors.toCollection(LinkedHashSet::new));14 System.out.println("set: " + set[java, stream]);1516 List<String> items→ [a, bb, ccc] = Arrays.asList("a", "bb", "ccc");17 Map<String, Integer> lengths→ {a=1, bb=2, ccc=3} = items.stream()18 .collect(Collectors.toMap(s -> s, String::length, (a, b) -> a, LinkedHashMap::new));19 System.out.println("lengths: " + lengths{a=1, bb=2, ccc=3});outputlist: [JAVA, STREAM] set: [java, stream] lengths: {a=1, bb=2, ccc=3}
Joining Strings
The joining collector concatenates strings with optional delimiter, prefix, and suffix.
import java.util.*;
import java.util.stream.*;
public class Joining {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");
String delimiter = ", ";
String concat = words.stream().collect(Collectors.joining());
System.out.println("concat: " + concat);
String csv = words.stream().collect(Collectors.joining(delimiter));
System.out.println("csv: " + csv);
String bracketed = words.stream()
.collect(Collectors.joining(", ", "[", "]"));
System.out.println("bracketed: " + bracketed);
List<Integer> nums = Arrays.asList(1, 2, 3);
String result = nums.stream()
.map(n -> "num" + n)
.collect(Collectors.joining(" | "));
System.out.println("result: " + result);
}
}
import java.util.*;
import java.util.stream.*;
public class Joining {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");
String delimiter = " | ";
String concat = words.stream().collect(Collectors.joining());
System.out.println("concat: " + concat);
String csv = words.stream().collect(Collectors.joining(delimiter));
System.out.println("csv: " + csv);
String bracketed = words.stream()
.collect(Collectors.joining(", ", "[", "]"));
System.out.println("bracketed: " + bracketed);
List<Integer> nums = Arrays.asList(1, 2, 3);
String result = nums.stream()
.map(n -> "num" + n)
.collect(Collectors.joining(" | "));
System.out.println("result: " + result);
}
}
import java.util.*;
import java.util.stream.*;
public class Joining {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");
String delimiter = "";
String concat = words.stream().collect(Collectors.joining());
System.out.println("concat: " + concat);
String csv = words.stream().collect(Collectors.joining(delimiter));
System.out.println("csv: " + csv);
String bracketed = words.stream()
.collect(Collectors.joining(", ", "[", "]"));
System.out.println("bracketed: " + bracketed);
List<Integer> nums = Arrays.asList(1, 2, 3);
String result = nums.stream()
.map(n -> "num" + n)
.collect(Collectors.joining(" | "));
System.out.println("result: " + result);
}
}
words ← [apple, banana, cherry], delimiter ← , , concat ← applebananacherry
4public class Joining {5 public static void main(String[] args) {6 List<String> words→ [apple, banana, cherry] = Arrays.asList("apple", "banana", "cherry");7 String delimiter→ , = ", "; //@delimiter=", ", " | ", ""89 String concat→ applebananacherry = words.stream().collect(Collectors.joining());10 System.out.println("concat: " + concatapplebananacherry);1112 String csv→ apple, banana, cherry = words.stream().collect(Collectors.joining(delimiter, ));13 System.out.println("csv: " + csvapple, banana, cherry);1415 String bracketed→ [apple, banana, cherry] = words.stream()16 .collect(Collectors.joining(", ", "[", "]"));17 System.out.println("bracketed: " + bracketed[apple, banana, cherry]);1819 List<Integer> nums→ [1, 2, 3] = Arrays.asList(1, 2, 3);20 String result→ num1 | num2 | num3 = nums.stream()21 .map(n -> "num" + n)22 .collect(Collectors.joining(" | "));23 System.out.println("result: " + resultnum1 | num2 | num3);outputconcat: applebananacherry csv: apple, banana, cherry bracketed: [apple, banana, cherry] result: num1 | num2 | num3
words ← [apple, banana, cherry], delimiter ← | , concat ← applebananacherry
4public class Joining {5 public static void main(String[] args) {6 List<String> words→ [apple, banana, cherry] = Arrays.asList("apple", "banana", "cherry");7 String delimiter→ | = " | ";89 String concat→ applebananacherry = words.stream().collect(Collectors.joining());10 System.out.println("concat: " + concatapplebananacherry);1112 String csv→ apple | banana | cherry = words.stream().collect(Collectors.joining(delimiter | ));13 System.out.println("csv: " + csvapple | banana | cherry);1415 String bracketed→ [apple, banana, cherry] = words.stream()16 .collect(Collectors.joining(", ", "[", "]"));17 System.out.println("bracketed: " + bracketed[apple, banana, cherry]);1819 List<Integer> nums→ [1, 2, 3] = Arrays.asList(1, 2, 3);20 String result→ num1 | num2 | num3 = nums.stream()21 .map(n -> "num" + n)22 .collect(Collectors.joining(" | "));23 System.out.println("result: " + resultnum1 | num2 | num3);outputconcat: applebananacherry csv: apple | banana | cherry bracketed: [apple, banana, cherry] result: num1 | num2 | num3
words ← [apple, banana, cherry], delimiter ← (empty), concat ← applebananacherry
4public class Joining {5 public static void main(String[] args) {6 List<String> words→ [apple, banana, cherry] = Arrays.asList("apple", "banana", "cherry");7 String delimiter→ (empty) = "";89 String concat→ applebananacherry = words.stream().collect(Collectors.joining());10 System.out.println("concat: " + concatapplebananacherry);1112 String csv→ applebananacherry = words.stream().collect(Collectors.joining(delimiter(empty)));13 System.out.println("csv: " + csvapplebananacherry);1415 String bracketed→ [apple, banana, cherry] = words.stream()16 .collect(Collectors.joining(", ", "[", "]"));17 System.out.println("bracketed: " + bracketed[apple, banana, cherry]);1819 List<Integer> nums→ [1, 2, 3] = Arrays.asList(1, 2, 3);20 String result→ num1 | num2 | num3 = nums.stream()21 .map(n -> "num" + n)22 .collect(Collectors.joining(" | "));23 System.out.println("result: " + resultnum1 | num2 | num3);outputconcat: applebananacherry csv: applebananacherry bracketed: [apple, banana, cherry] result: num1 | num2 | num3
Grouping
Group elements by a classification function into a Map<K, List<T>>.
import java.util.*;
import java.util.stream.*;
public class Grouping {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "apricot", "banana", "blueberry", "cherry");
Map<Character, List<String>> byFirstLetter = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.toList()));
System.out.println("byFirstLetter: " + byFirstLetter);
Map<Integer, List<String>> byLength = words.stream()
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
System.out.println("byLength: " + byLength);
Map<Character, Long> counts = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.counting()));
System.out.println("counts: " + counts);
Map<Character, Double> avgLengths = words.stream()
.collect(Collectors.groupingBy(
w -> w.charAt(0),
TreeMap::new,
Collectors.averagingInt(String::length)
));
System.out.println("avgLengths: " + avgLengths);
}
}
import java.util.*;
import java.util.stream.*;
public class Grouping {
public static void main(String[] args) {
List<String> words = Arrays.asList("car", "cat", "dog", "door");
Map<Character, List<String>> byFirstLetter = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.toList()));
System.out.println("byFirstLetter: " + byFirstLetter);
Map<Integer, List<String>> byLength = words.stream()
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
System.out.println("byLength: " + byLength);
Map<Character, Long> counts = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.counting()));
System.out.println("counts: " + counts);
Map<Character, Double> avgLengths = words.stream()
.collect(Collectors.groupingBy(
w -> w.charAt(0),
TreeMap::new,
Collectors.averagingInt(String::length)
));
System.out.println("avgLengths: " + avgLengths);
}
}
import java.util.*;
import java.util.stream.*;
public class Grouping {
public static void main(String[] args) {
List<String> words = Arrays.asList("red", "rose", "blue");
Map<Character, List<String>> byFirstLetter = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.toList()));
System.out.println("byFirstLetter: " + byFirstLetter);
Map<Integer, List<String>> byLength = words.stream()
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
System.out.println("byLength: " + byLength);
Map<Character, Long> counts = words.stream()
.collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.counting()));
System.out.println("counts: " + counts);
Map<Character, Double> avgLengths = words.stream()
.collect(Collectors.groupingBy(
w -> w.charAt(0),
TreeMap::new,
Collectors.averagingInt(String::length)
));
System.out.println("avgLengths: " + avgLengths);
}
}
words ← [apple, apricot, banana, blueberry, cherry], byFirstLetter ← {a=[apple, apricot], b=[banana, blueberry], c=[cherry]}
4public class Grouping {5 public static void main(String[] args) {6 List<String> words→ [apple, apricot, banana, blueberry, cherry] = Arrays.asList("apple", "apricot", "banana", "blueberry", "cherry"); //@words=Arrays.asList("apple", "apricot", "banana", "blueberry", "cherry"), Arrays.asList("car", "cat", "dog", "door"), Arrays.asList("red", "rose", "blue")78 Map<Character, List<String>> byFirstLetter→ {a=[apple, apricot], b=[banana, blueberry], c=[cherry]} = words.stream()9 .collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.toList()));10 System.out.println("byFirstLetter: " + byFirstLetter{a=[apple, apricot], b=[banana, blueberry], c=[cherry]});1112 Map<Integer, List<String>> byLength→ {5=[apple], 6=[banana, cherry], 7=[apricot], 9=[blueberry]} = words.stream()13 .collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));14 System.out.println("byLength: " + byLength{5=[apple], 6=[banana, cherry], 7=[apricot], 9=[blueberry]});1516 Map<Character, Long> counts→ {a=2, b=2, c=1} = words.stream()17 .collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.counting()));18 System.out.println("counts: " + counts{a=2, b=2, c=1});1920 Map<Character, Double> avgLengths→ {a=6.0, b=7.5, c=6.0} = words.stream()21 .collect(Collectors.groupingBy(22 w -> w.charAt(0),23 TreeMap::new,24 Collectors.averagingInt(String::length)25 ));26 System.out.println("avgLengths: " + avgLengths{a=6.0, b=7.5, c=6.0});outputbyFirstLetter: {a=[apple, apricot], b=[banana, blueberry], c=[cherry]} byLength: {5=[apple], 6=[banana, cherry], 7=[apricot], 9=[blueberry]} counts: {a=2, b=2, c=1} avgLengths: {a=6.0, b=7.5, c=6.0}
words ← [car, cat, dog, door], byFirstLetter ← {c=[car, cat], d=[dog, door]}
4public class Grouping {5 public static void main(String[] args) {6 List<String> words→ [car, cat, dog, door] = Arrays.asList("car", "cat", "dog", "door");78 Map<Character, List<String>> byFirstLetter→ {c=[car, cat], d=[dog, door]} = words.stream()9 .collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.toList()));10 System.out.println("byFirstLetter: " + byFirstLetter{c=[car, cat], d=[dog, door]});1112 Map<Integer, List<String>> byLength→ {3=[car, cat, dog], 4=[door]} = words.stream()13 .collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));14 System.out.println("byLength: " + byLength{3=[car, cat, dog], 4=[door]});1516 Map<Character, Long> counts→ {c=2, d=2} = words.stream()17 .collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.counting()));18 System.out.println("counts: " + counts{c=2, d=2});1920 Map<Character, Double> avgLengths→ {c=3.0, d=3.5} = words.stream()21 .collect(Collectors.groupingBy(22 w -> w.charAt(0),23 TreeMap::new,24 Collectors.averagingInt(String::length)25 ));26 System.out.println("avgLengths: " + avgLengths{c=3.0, d=3.5});outputbyFirstLetter: {c=[car, cat], d=[dog, door]} byLength: {3=[car, cat, dog], 4=[door]} counts: {c=2, d=2} avgLengths: {c=3.0, d=3.5}
words ← [red, rose, blue], byFirstLetter ← {b=[blue], r=[red, rose]}
4public class Grouping {5 public static void main(String[] args) {6 List<String> words→ [red, rose, blue] = Arrays.asList("red", "rose", "blue");78 Map<Character, List<String>> byFirstLetter→ {b=[blue], r=[red, rose]} = words.stream()9 .collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.toList()));10 System.out.println("byFirstLetter: " + byFirstLetter{b=[blue], r=[red, rose]});1112 Map<Integer, List<String>> byLength→ {3=[red], 4=[rose, blue]} = words.stream()13 .collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));14 System.out.println("byLength: " + byLength{3=[red], 4=[rose, blue]});1516 Map<Character, Long> counts→ {b=1, r=2} = words.stream()17 .collect(Collectors.groupingBy(w -> w.charAt(0), TreeMap::new, Collectors.counting()));18 System.out.println("counts: " + counts{b=1, r=2});1920 Map<Character, Double> avgLengths→ {b=4.0, r=3.5} = words.stream()21 .collect(Collectors.groupingBy(22 w -> w.charAt(0),23 TreeMap::new,24 Collectors.averagingInt(String::length)25 ));26 System.out.println("avgLengths: " + avgLengths{b=4.0, r=3.5});outputbyFirstLetter: {b=[blue], r=[red, rose]} byLength: {3=[red], 4=[rose, blue]} counts: {b=1, r=2} avgLengths: {b=4.0, r=3.5}
Partitioning
Partition elements into two groups based on a predicate: Map<Boolean, List<T>>.
import java.util.*;
import java.util.stream.*;
public class Partitioning {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
int minWordLength = 3;
Map<Boolean, List<Integer>> partitioned = nums.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println("evens: " + partitioned.get(true));
System.out.println("odds: " + partitioned.get(false));
List<String> words = Arrays.asList("a", "bb", "ccc", "d", "eeee");
Map<Boolean, List<String>> longWords = words.stream()
.collect(Collectors.partitioningBy(s -> s.length() >= minWordLength));
System.out.println("longWords: " + longWords);
Map<Boolean, Long> counts = nums.stream()
.collect(Collectors.partitioningBy(n -> n > 5, Collectors.counting()));
System.out.println("counts: " + counts);
}
}
import java.util.*;
import java.util.stream.*;
public class Partitioning {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
int minWordLength = 2;
Map<Boolean, List<Integer>> partitioned = nums.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println("evens: " + partitioned.get(true));
System.out.println("odds: " + partitioned.get(false));
List<String> words = Arrays.asList("a", "bb", "ccc", "d", "eeee");
Map<Boolean, List<String>> longWords = words.stream()
.collect(Collectors.partitioningBy(s -> s.length() >= minWordLength));
System.out.println("longWords: " + longWords);
Map<Boolean, Long> counts = nums.stream()
.collect(Collectors.partitioningBy(n -> n > 5, Collectors.counting()));
System.out.println("counts: " + counts);
}
}
import java.util.*;
import java.util.stream.*;
public class Partitioning {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
int minWordLength = 5;
Map<Boolean, List<Integer>> partitioned = nums.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println("evens: " + partitioned.get(true));
System.out.println("odds: " + partitioned.get(false));
List<String> words = Arrays.asList("a", "bb", "ccc", "d", "eeee");
Map<Boolean, List<String>> longWords = words.stream()
.collect(Collectors.partitioningBy(s -> s.length() >= minWordLength));
System.out.println("longWords: " + longWords);
Map<Boolean, Long> counts = nums.stream()
.collect(Collectors.partitioningBy(n -> n > 5, Collectors.counting()));
System.out.println("counts: " + counts);
}
}
nums ← [1, 2, 3, 4, 5, 6, 7, 8], minWordLength ← 3, partitioned ← {false=[1, 3, 5, 7], true=[2, 4, 6, 8]}
4public class Partitioning {5 public static void main(String[] args) {6 List<Integer> nums→ [1, 2, 3, 4, 5, 6, 7, 8] = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);7 int minWordLength→ 3 = 3; //@minWordLength=3, 2, 589 Map<Boolean, List<Integer>> partitioned→ {false=[1, 3, 5, 7], true=[2, 4, 6, 8]} = nums.stream()10 .collect(Collectors.partitioningBy(n -> n % 2 == 0));11 System.out.println("evens: " + partitioned.get(true));12 System.out.println("odds: " + partitioned.get(false));1314 List<String> words→ [a, bb, ccc, d, eeee] = Arrays.asList("a", "bb", "ccc", "d", "eeee");15 Map<Boolean, List<String>> longWords→ {false=[a, bb, d], true=[ccc, eeee]} = words.stream()16 .collect(Collectors.partitioningBy(s -> s.length() >= minWordLength));17 System.out.println("longWords: " + longWords{false=[a, bb, d], true=[ccc, eeee]});1819 Map<Boolean, Long> counts→ {false=5, true=3} = nums.stream()20 .collect(Collectors.partitioningBy(n -> n > 5, Collectors.counting()));21 System.out.println("counts: " + counts{false=5, true=3});outputevens: [2, 4, 6, 8] odds: [1, 3, 5, 7] longWords: {false=[a, bb, d], true=[ccc, eeee]} counts: {false=5, true=3}
nums ← [1, 2, 3, 4, 5, 6, 7, 8], minWordLength ← 2, partitioned ← {false=[1, 3, 5, 7], true=[2, 4, 6, 8]}
4public class Partitioning {5 public static void main(String[] args) {6 List<Integer> nums→ [1, 2, 3, 4, 5, 6, 7, 8] = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);7 int minWordLength→ 2 = 2;89 Map<Boolean, List<Integer>> partitioned→ {false=[1, 3, 5, 7], true=[2, 4, 6, 8]} = nums.stream()10 .collect(Collectors.partitioningBy(n -> n % 2 == 0));11 System.out.println("evens: " + partitioned.get(true));12 System.out.println("odds: " + partitioned.get(false));1314 List<String> words→ [a, bb, ccc, d, eeee] = Arrays.asList("a", "bb", "ccc", "d", "eeee");15 Map<Boolean, List<String>> longWords→ {false=[a, d], true=[bb, ccc, eeee]} = words.stream()16 .collect(Collectors.partitioningBy(s -> s.length() >= minWordLength));17 System.out.println("longWords: " + longWords{false=[a, d], true=[bb, ccc, eeee]});1819 Map<Boolean, Long> counts→ {false=5, true=3} = nums.stream()20 .collect(Collectors.partitioningBy(n -> n > 5, Collectors.counting()));21 System.out.println("counts: " + counts{false=5, true=3});outputevens: [2, 4, 6, 8] odds: [1, 3, 5, 7] longWords: {false=[a, d], true=[bb, ccc, eeee]} counts: {false=5, true=3}
nums ← [1, 2, 3, 4, 5, 6, 7, 8], minWordLength ← 5, partitioned ← {false=[1, 3, 5, 7], true=[2, 4, 6, 8]}
4public class Partitioning {5 public static void main(String[] args) {6 List<Integer> nums→ [1, 2, 3, 4, 5, 6, 7, 8] = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);7 int minWordLength→ 5 = 5;89 Map<Boolean, List<Integer>> partitioned→ {false=[1, 3, 5, 7], true=[2, 4, 6, 8]} = nums.stream()10 .collect(Collectors.partitioningBy(n -> n % 2 == 0));11 System.out.println("evens: " + partitioned.get(true));12 System.out.println("odds: " + partitioned.get(false));1314 List<String> words→ [a, bb, ccc, d, eeee] = Arrays.asList("a", "bb", "ccc", "d", "eeee");15 Map<Boolean, List<String>> longWords→ {false=[a, bb, ccc, d, eeee], true=[]} = words.stream()16 .collect(Collectors.partitioningBy(s -> s.length() >= minWordLength));17 System.out.println("longWords: " + longWords{false=[a, bb, ccc, d, eeee], true=[]});1819 Map<Boolean, Long> counts→ {false=5, true=3} = nums.stream()20 .collect(Collectors.partitioningBy(n -> n > 5, Collectors.counting()));21 System.out.println("counts: " + counts{false=5, true=3});outputevens: [2, 4, 6, 8] odds: [1, 3, 5, 7] longWords: {false=[a, bb, ccc, d, eeee], true=[]} counts: {false=5, true=3}
Aggregations with Downstream Collectors
Combine grouping with downstream collectors for powerful aggregations.
import java.util.*;
import java.util.stream.*;
public class Aggregations {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
long count = nums.stream().collect(Collectors.counting());
System.out.println("count: " + count);
int sum = nums.stream().collect(Collectors.summingInt(Integer::intValue));
System.out.println("sum: " + sum);
double avg = nums.stream().collect(Collectors.averagingDouble(Integer::doubleValue));
System.out.println("avg: " + avg);
IntSummaryStatistics stats = nums.stream().collect(Collectors.summarizingInt(Integer::intValue));
System.out.println("stats: count=" + stats.getCount() + ", sum=" + stats.getSum() +
", min=" + stats.getMin() + ", max=" + stats.getMax() + ", avg=" + stats.getAverage());
}
}
import java.util.*;
import java.util.stream.*;
public class Aggregations {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(10, 20, 30);
long count = nums.stream().collect(Collectors.counting());
System.out.println("count: " + count);
int sum = nums.stream().collect(Collectors.summingInt(Integer::intValue));
System.out.println("sum: " + sum);
double avg = nums.stream().collect(Collectors.averagingDouble(Integer::doubleValue));
System.out.println("avg: " + avg);
IntSummaryStatistics stats = nums.stream().collect(Collectors.summarizingInt(Integer::intValue));
System.out.println("stats: count=" + stats.getCount() + ", sum=" + stats.getSum() +
", min=" + stats.getMin() + ", max=" + stats.getMax() + ", avg=" + stats.getAverage());
}
}
import java.util.*;
import java.util.stream.*;
public class Aggregations {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(2, 2, 8);
long count = nums.stream().collect(Collectors.counting());
System.out.println("count: " + count);
int sum = nums.stream().collect(Collectors.summingInt(Integer::intValue));
System.out.println("sum: " + sum);
double avg = nums.stream().collect(Collectors.averagingDouble(Integer::doubleValue));
System.out.println("avg: " + avg);
IntSummaryStatistics stats = nums.stream().collect(Collectors.summarizingInt(Integer::intValue));
System.out.println("stats: count=" + stats.getCount() + ", sum=" + stats.getSum() +
", min=" + stats.getMin() + ", max=" + stats.getMax() + ", avg=" + stats.getAverage());
}
}
nums ← [1, 2, 3, 4, 5], count ← 5, sum ← 15, avg ← 3.0, stats ← IntSummaryStatistics{count=5, sum=15, min=1, average=3.000000, max=5}
4public class Aggregations {5 public static void main(String[] args) {6 List<Integer> nums→ [1, 2, 3, 4, 5] = Arrays.asList(1, 2, 3, 4, 5); //@nums=Arrays.asList(1, 2, 3, 4, 5), Arrays.asList(10, 20, 30), Arrays.asList(2, 2, 8)78 long count→ 5 = nums.stream().collect(Collectors.counting());9 System.out.println("count: " + count5);1011 int sum→ 15 = nums.stream().collect(Collectors.summingInt(Integer::intValue));12 System.out.println("sum: " + sum15);1314 double avg→ 3.0 = nums.stream().collect(Collectors.averagingDouble(Integer::doubleValue));15 System.out.println("avg: " + avg3.0);1617 IntSummaryStatistics stats→ IntSummaryStatistics{count=5, sum=15, min=1, average=3.000000, max=5} = nums.stream().collect(Collectors.summarizingInt(Integer::intValue));18 System.out.println("stats: count=" + stats.getCount() + ", sum=" + stats.getSum() +19 ", min=" + stats.getMin() + ", max=" + stats.getMax() + ", avg=" + stats.getAverage());outputcount: 5 sum: 15 avg: 3.0 stats: count=5, sum=15, min=1, max=5, avg=3.0
nums ← [10, 20, 30], count ← 3, sum ← 60, avg ← 20.0, stats ← IntSummaryStatistics{count=3, sum=60, min=10, average=20.000000, max=30}
4public class Aggregations {5 public static void main(String[] args) {6 List<Integer> nums→ [10, 20, 30] = Arrays.asList(10, 20, 30);78 long count→ 3 = nums.stream().collect(Collectors.counting());9 System.out.println("count: " + count3);1011 int sum→ 60 = nums.stream().collect(Collectors.summingInt(Integer::intValue));12 System.out.println("sum: " + sum60);1314 double avg→ 20.0 = nums.stream().collect(Collectors.averagingDouble(Integer::doubleValue));15 System.out.println("avg: " + avg20.0);1617 IntSummaryStatistics stats→ IntSummaryStatistics{count=3, sum=60, min=10, average=20.000000, max=30} = nums.stream().collect(Collectors.summarizingInt(Integer::intValue));18 System.out.println("stats: count=" + stats.getCount() + ", sum=" + stats.getSum() +19 ", min=" + stats.getMin() + ", max=" + stats.getMax() + ", avg=" + stats.getAverage());outputcount: 3 sum: 60 avg: 20.0 stats: count=3, sum=60, min=10, max=30, avg=20.0
nums ← [2, 2, 8], count ← 3, sum ← 12, avg ← 4.0, stats ← IntSummaryStatistics{count=3, sum=12, min=2, average=4.000000, max=8}
4public class Aggregations {5 public static void main(String[] args) {6 List<Integer> nums→ [2, 2, 8] = Arrays.asList(2, 2, 8);78 long count→ 3 = nums.stream().collect(Collectors.counting());9 System.out.println("count: " + count3);1011 int sum→ 12 = nums.stream().collect(Collectors.summingInt(Integer::intValue));12 System.out.println("sum: " + sum12);1314 double avg→ 4.0 = nums.stream().collect(Collectors.averagingDouble(Integer::doubleValue));15 System.out.println("avg: " + avg4.0);1617 IntSummaryStatistics stats→ IntSummaryStatistics{count=3, sum=12, min=2, average=4.000000, max=8} = nums.stream().collect(Collectors.summarizingInt(Integer::intValue));18 System.out.println("stats: count=" + stats.getCount() + ", sum=" + stats.getSum() +19 ", min=" + stats.getMin() + ", max=" + stats.getMax() + ", avg=" + stats.getAverage());outputcount: 3 sum: 12 avg: 4.0 stats: count=3, sum=12, min=2, max=8, avg=4.0
Exercise: Practical.java
Collect transaction data grouped by category with totals and counts