Streams: Counting, Summing and Grouping

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.

HOME LABS COMMUNITY DASHBOARD