Getting one answer out
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> marks = Arrays.asList(78, 92, 65, 88, 40);
long passed = marks.stream().filter(m -> m >= 50).count();
int total = marks.stream().mapToInt(m -> m).sum();
double avg = marks.stream().mapToInt(m -> m).average().orElse(0);
int best = marks.stream().mapToInt(m -> m).max().getAsInt();
System.out.println("Passed: " + passed);
System.out.println("Total: " + total);
System.out.println("Average: " + avg);
System.out.println("Best: " + best);
System.out.println("Anyone 90+? " + marks.stream().anyMatch(m -> m >= 90));
}
}Output
Passed: 4 Total: 363 Average: 72.6 Best: 92 Anyone 90+? true
mapToInt turns the stream into a stream of plain ints, which has sum(), average() and max().
Number ranges
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int sum = IntStream.rangeClosed(1, 100).sum();
System.out.println(sum);
IntStream.range(0, 5).forEach(i -> System.out.print(i + " "));
System.out.println();
}
}Output
5050 0 1 2 3 4
reduce: combine everything into one
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
int product = nums.stream().reduce(1, (a, b) -> a * b);
System.out.println(product);
}
}Output
120
reduce(1, ...) starts at 1 and multiplies each item in: 1×1×2×3×4×5 = 120.
Grouping
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("cat", "apple", "dog", "banana", "egg", "kiwi");
Map<Integer, List<String>> byLength = words.stream()
.collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
System.out.println(byLength);
}
}Output
{3=[cat, dog, egg], 4=[kiwi], 5=[apple], 6=[banana]}Optional: maybe there's an answer
Some stream results might not exist – like the first word starting with “z”. They come back as an Optional, a box that may be empty:
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry");
Optional<String> b = words.stream().filter(w -> w.startsWith("b")).findFirst();
Optional<String> z = words.stream().filter(w -> w.startsWith("z")).findFirst();
System.out.println(b.isPresent() + " " + b.get());
System.out.println(z.isPresent());
System.out.println(z.orElse("nothing found"));
}
}Output
true banana false nothing found
Tip: Streams are great for “filter, change, summarise” jobs. For complicated step-by-step logic, a normal loop is often clearer – both are fine.