Reactor3 Flux 创建

本文档详细介绍了如何在Reactor3中创建Flux,包括使用Flux类的静态方法,如generate()和create()。generate()方法允许通过SynchronousSink生成同步序列,而create()方法则用于处理阻塞与异步场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Reactor3 Flux 创建

1 创建 Flux

1.1 Flux 类中的静态方法
		// 1 just():可以指定序列中包含的全部元素
        // 创建出来的 Flux 序列在发布这些元素之后会自动结束
        Flux.just("1", "2", "3").subscribe(System.out::println);
        // 2 fromArray(),fromIterable()和 fromStream():
        // 可以从一个数组、Iterable 对象或 Stream 对象中创建 Flux 对象
        Flux.fromArray(new Integer[]{4, 5, 6}).subscribe(System.out::println);
        // 3 empty():创建一个不包含任何元素,只发布结束消息的序列
        Flux.empty().subscribe(System.out::println);
        // 4 range(int start, int count):
        // 创建包含从 start 起始的 count 个数量的 Integer 对象的序列。
        Flux.range(7, 3).subscribe(System.out::println);
        // 5 interval(Duration period)和 interval(Duration delay, Duration period):
        // 创建一个包含了从 0 开始递增的 Long 对象的序列。其中包含的元素按照指定的间隔来发布。除了间隔时间之外,
        // 还可以指定起始元素发布之前的延迟时间
        // 每2秒产生一个元素
        Flux.interval(Duration.of(2, ChronoUnit.SECONDS)).subscribe(System.out::println);
        // 每1000微秒产生一个元素
        Flux.intervalMillis(1000).subscribe(System.out::println);
        TimeUnit.SECONDS.sleep(5);
1.2 generate()方法

generate()方法通过同步和逐一的方式来产生 Flux 序列。
序列的产生是通过调用所提供的 SynchronousSink 对象的 next(),complete()和 error(Throwable)方法来完成的。
逐一生成的含义是在具体的生成逻辑中,next()方法只能最多被调用一次。

  • public static <T> Flux <T> generate(Consumer<SynchronousSink<T>> generator)

SynchronousSink.next()产生元素, SynchronousSink.compelete()结束。

  • public static <T, S> Flux<T> generate(Callable<S> stateSupplier, BiFunction<S, SynchronousSink<T>, S> generator)

Callable<S> 会提供一个有状态的对象。

  • public static <T, S> Flux<T> generate(Callable<S> stateSupplier, BiFunction<S, SynchronousSink<T>, S> generator, Consumer<? super S> stateConsumer)

第三个参数 stateConsumer 是第一个参数stateSupplier的consumer。

		//generate
        final AtomicInteger count = new AtomicInteger(1);
        Flux.generate(synchronousSink -> {
            synchronousSink.next(count + " --> " + new Random().nextInt());
            // 不complete() 将一直产生"Hello" 可以注掉看下效果
            if (count.getAndIncrement() >= 5) {
                synchronousSink.complete();
            }
        })
                .doOnNext(number -> System.out.println(number))
                .doOnNext(number -> System.out.println(number.toString() + 4))
                .subscribe();
        System.out.println("-------分割线-------");

        // 将names中姓名的首字母转成大写
        final AtomicInteger index = new AtomicInteger(0);
        List<String> names = Arrays.asList("weison", "evan", "elen");
        Flux.generate(() -> names, (nameList, synchronousSink) -> {
            String s = nameList.get(index.get());
            String s1 = s.substring(0, 1).toUpperCase() + s.substring(1);
            synchronousSink.next(s1);
            if (index.getAndIncrement() == nameList.size() - 1)
                synchronousSink.complete();
            return nameList;
        }).subscribe(System.out::println);
        System.out.println("-------分割线-------");


        //第三个参数 stateConsumer 是第一个参数的consumer
        final AtomicInteger index1 = new AtomicInteger(0);
        Flux.generate(() -> names, (nameList, synchronousSink) -> {
            String s = nameList.get(index1.get());
            String s1 = s.substring(0, 1).toUpperCase() + s.substring(1);
            synchronousSink.next(s1);
            if (index1.getAndIncrement() == nameList.size() - 1)
                synchronousSink.complete();
            return nameList;
        }, System.out::println).subscribe(System.out::println);

结果

 --> 1410943965
2 --> 519628392
3 --> -1853057073
4 --> -945435601
5 --> 510298439
-------分割线-------
Weison
Evan
Elen
-------分割线-------
Weison
Evan
Elen
[weison, evan, elen]
1.3 create()方法

create()用于阻塞方法与异步代码之间的交互等

Flux.create(sink -> {
            for (int i = 0; i < 5; i++) {
                sink.next(new Random().nextInt());
            }
            sink.complete();
        }).subscribe(System.out::println);
        System.out.println("-------分割线-------");

        Flux.create(sink -> {
            for (int i = 0; i < 5; i++) {
                sink.next(new Random().nextInt());
            }
            sink.complete();
        }, FluxSink.OverflowStrategy.BUFFER).subscribe(System.out::println);
        System.out.println("-------分割线-------");

        Flux.create((FluxSink<String> sink) -> {
            List<String> articals = getArticalsFromServer();
            articals.forEach(sink::next);
        }, FluxSink.OverflowStrategy.LATEST)
                .doOnNext(number -> System.out.println(number))
                .doOnNext(number -> System.out.println(number + 4))
                .subscribe(System.out::println);
        System.out.println("-------分割线-------");

        Flux.create(fluxSink -> {
            fluxSink.next("Weison");
            fluxSink.next("Even");
            fluxSink.error(new Exception("Err"));
        }, FluxSink.OverflowStrategy.ERROR)
                .onErrorReturn("我出错了~")
                .publishOn(Schedulers.parallel())
                .subscribe(System.out::println);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值