Using Java 8 Stream API for Collection Processing – Concepts and Code Examples

This article introduces Java 8's Stream API, explains its declarative pipeline model for filtering, mapping, sorting, and collecting data, demonstrates each operation with a UserPo example, and provides complete runnable code including parallel streams and statistical summaries.

Top Architect
Top Architect
Top Architect
Using Java 8 Stream API for Collection Processing – Concepts and Code Examples

Java 8 introduced the Stream API, providing a declarative way to process collections similar to SQL queries.

The Stream pipeline treats a collection as a flow of elements that can be filtered, sorted, mapped, and collected.

Example PO class UserPo is used to demonstrate operations.

filter – selects elements meeting a predicate, e.g., counting non‑null scores.

long count = list.stream()
    .filter(p -> p.getScore() != null)
    .count();

map – transforms each element, e.g., extracting scores or joining names.

List<Double> scoreList = list.stream()
    .map(UserPo::getScore)
    .collect(Collectors.toList());

String nameString = list.stream()
    .map(UserPo::getName)
    .collect(Collectors.joining(","));

sorted – orders elements, e.g., descending by score.

List<UserPo> sorted = list.stream()
    .filter(p -> p.getScore() != null)
    .sorted(Comparator.comparing(UserPo::getScore).reversed())
    .collect(Collectors.toList());

forEach – performs an action on each element, such as adding 10 points.

sorted.forEach(p -> p.setScore(p.getScore() + 10));

collect – aggregates results, demonstrated with grouping by score and converting to lists or strings.

Map<Double, List<UserPo>> byScore = list.stream()
    .filter(p -> p.getScore() != null)
    .collect(Collectors.groupingBy(UserPo::getScore));

statistics – obtains summary statistics of numeric streams.

DoubleSummaryStatistics stats = sorted.stream()
    .mapToDouble(UserPo::getScore)
    .summaryStatistics();

parallelStream – runs the pipeline in parallel to improve performance, with the same operations as above.

long parallelCount = list.parallelStream()
    .filter(p -> p.getScore() != null)
    .count();

Full example code for UserPo class and a main method ( StreamTest) is provided, showing creation of sample data and applying the described Stream operations.

public class UserPo {
    private String name;
    private Double score;
    // constructors, getters, setters, toString...
}

public class StreamTest {
    public static void main(String[] args) {
        List<UserPo> list = new ArrayList<>();
        list.add(new UserPo("小一", 10d));
        list.add(new UserPo("小五", 50d));
        list.add(new UserPo("小六", 60d));
        list.add(new UserPo("小6", 60d));
        list.add(new UserPo("小空", null));
        list.add(new UserPo("小九", 90d));
        // apply stream operations as shown above
    }
}
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

JavaLambdafunctional programmingCollectionsStream API
Top Architect
Written by

Top Architect

Top Architect focuses on sharing practical architecture knowledge, covering enterprise, system, website, large‑scale distributed, and high‑availability architectures, plus architecture adjustments using internet technologies. We welcome idea‑driven, sharing‑oriented architects to exchange and learn together.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.