学习如何创建 Flux 实例

学习如何创建 Flux 实例

描述

AFlux<T>是一个响应式流Publisher,它增强了许多操作符,可用于生成、转换、编排 Flux 序列。
它可以发出 0 到n 个 <T>元素(onNext事件),然后完成或出错(onComplete以及onError终止事件)。如果没有触发终止事件,则循环Flux将无限进行。

  • Flux 上的静态工厂允许创建源,或从多个回调类型生成源。
  • 实例方法(即运算符)允许您构建异步处理管道,该管道将生成异步序列。
  • 每个Flux#subscribe()或多播操作(例如Flux#publishFlux#publishNext 都会创建一个专用的管道实例,并触发其中的数据流。
    请参阅此处的 javadoc
    image

实践

tip
提示:如果您想了解某个操作内部正在发生什么Flux,或者Mono在练习过程中即将返回某个操作,您可以.log()在返回之前随时向该操作添加参数。第 6 部分就用到了这一点。

package com.qinrenjihe;

import org.jspecify.annotations.NonNull;
import reactor.core.publisher.Flux;

public class Main {
    // 创建一个空的 Flux
    static Flux<@NonNull String> emptyFlux() {
        return Flux.empty();
    }

    // 返回一个包含2个值“foo”和“bar”的Flux,而不使用数组或集合
    static Flux<@NonNull String> fooBarFluxFromValues() {
        return Flux.just("foo", "bar");
    }

    // fooBarFluxFromList 从包含两个值“foo”和“bar”的列表中创建一个Flux
    static Flux<@NonNull String> fooBarFluxFromList() {
        return Flux.fromIterable(
                java.util.Arrays.asList("foo", "bar")
        );
    }

    // errorFlux 创建一个发出IllegalStateException的Flux
    static Flux<@NonNull String> errorFlux() {
        return Flux.error(new IllegalStateException("Something went wrong"));
    }

    // 创建一个通量,每100ms发出从0到9的递增值
    static Flux<@NonNull Long> counter() {
        return Flux.interval(java.time.Duration.ofMillis(100)).take(10);
    }

    public static void main(String[] args) {
        // 1. 创建一个空的 Flux
        Main.emptyFlux().subscribe(System.out::println);
        // 2. 返回一个包含2个值“foo”和“bar”的Flux,而不使用数组或集合
        Main.fooBarFluxFromValues().subscribe(System.out::println);
        // 3. 从包含两个值“foo”和“bar”的列表中创建一个Flux
        Main.fooBarFluxFromList().subscribe(System.out::println);
        // 4. 创建一个发出 IllegalStateException 的 Flux
        // Main.errorFlux().subscribe(System.out::println,Throwable::printStackTrace);
        // 5. 创建一个通量,每100ms发出从0到9的递增值
        Long lastValue = Main.counter()//
                .doOnNext(System.out::println) // 在发出每个值时打印
                .doFinally(System.out::println) // 在完成时打印
                .blockLast(); // 等待完成
        System.out.println("Last value: " + lastValue);
    }
}

原文:https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Flux

posted @ 2025-11-10 18:44  bigroc  阅读(12)  评论(0)    收藏  举报