Advertising for Intro To Reactor Core | Baeldung

What is Reactor Core?

Reactor Core is a Java 8 library that empowers developers to embrace reactive programming, a modern approach to building flexible and responsive applications. By following the Reactive Streams specification, Reactor provides a set of tools that allow for efficient handling of data streams, enabling developers to work with asynchronous data flow in a concise and elegant manner.

Key Features:

Getting Started:

To get started with Reactor Core, simply add the required Maven dependencies, including Reactor itself and Logback-classic for logging. Here's an example of the necessary code:

<dependencies>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId>
        <version>3.6.0</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.4</version>
    </dependency>
</dependencies>

Producing a Stream of Data:

In reactive programming, the first step is producing a stream of data. Reactor provides two primary data types for this purpose: Flux and Mono. Flux represents a stream that can emit 0 to n elements, while Mono is a stream of exactly one element. Here's an example of creating a simple static stream using Flux:

Flux<Integer> just = Flux.just(1, 2, 3, 4);

Subscribing to a Stream:

Once a stream is produced, subscribers can start consuming the data. Reactor provides methods like subscribe() and map() to collect elements and apply transformations. Here's an example of subscribing and collecting elements:

List<Integer> elements = new ArrayList<>();
Flux.just(1, 2, 3, 4)
        .log()
        .subscribe(elements::add);
assertThat(elements).containsExactly(1, 2, 3, 4);

Operating on a Stream:

Reactor allows for various operations on data streams, including mapping, filtering, and combining. For example, you can apply a transformation like doubling each number in the stream using the map() function:

<code class="language-java">Flux.just(1, 2, 3, 4)
        .log()
        .map(i -> i * 2)
        .subscribe(elements::add);

Combining Streams:

You can also combine multiple streams by using functions like zip() to create a new stream that zips together elements from two different streams. Here's an example:

<code class="language-java">Flux.just(1, 2, 3, 4)
        .log()
        .map(i -> i * 2)
        .zipWith(Flux.range(0, Integer.MAX_VALUE), (one, two) -> String.format("First Flux: %d, Second Flux: %d", one, two))
        .subscribe(elements::add);

Hot Streams and Throttling:

Reactor also supports hot streams, which are infinite and always running. You can create a hot stream by converting a cold stream using the publish() function. Additionally, you can control the rate at which data is pushed to subscribers using techniques like sampling or buffering.

Concurrency and Scheduling:

Reactor allows you to run code on different threads, providing concurrency and enabling efficient handling of multiple concurrent data streams. You can specify the thread to run a subscription on using methods like subscribeOn().

In conclusion, Reactor Core offers a robust set of tools for building reactive applications in Java. By following the Reactive Streams specification, Reactor provides a flexible and expressive way to work with data streams, making it an excellent choice for developers looking to build responsive and scalable systems.


2025-11-19