素材巴巴 > 程序开发 >

4、响应式编程

程序开发 2023-09-20 06:59:10

官网翻译

概念

背压机制

在生产者和消费者模型中,消费者除了消费生产者的数据之外,还需要一种向生产者反馈流量需求的机制,这个机制就是背压机制

不允许 Mono.just(null)会抛出空指针异常,Mono.justorEmpty(entity)这样就不会了,如果是null,就相当于Mono.empty().

Flux对象的创建

  @Testpublic void testCreate(){Integer[] tem = new Integer[5];Flux.fromArray(tem);
 //        Flux.interval(Duration.of(10, TemporalUnit));Duration duration = Duration.ofDays(1);System.out.println(60 * 60 * 24);System.out.println(duration.getSeconds());
 //        LocalDate.
 //        使用just产生 Create a Flux that emits the provided elements and then completes.Flux.just(1,2,3,4);
 //        产生从1开始的,数量为10的序列 Flux序列Flux range = Flux.range(1, 10);range.doOnNext(System.out::println).subscribe();
 //        Programmatically create a Flux by generating signals one-by-one via a consumer callback.
 //        动态产生 generate() 方法System.out.println("测试generate,最多只能调用一次next");Flux generate = Flux.generate((sink) -> {sink.next(100);
 //            必须要有这个complete方法,表示结束sink.complete();});generate.doOnNext(System.out::print).subscribe();System.out.println("测试create 可以多次调用next");Flux.create((sink)->{for (int i = 0; i < 30; i++) {sink.next(i);}sink.complete();}).doOnNext(System.out::print).subscribe();}
 

消费:

 @Testpublic void midoperate() {Flux objectFlux = Flux.create((sink) -> {for (int i = 0; i < 5; i++) {sink.next(i);}});
 //        需要注意的是buffe中的cap一定要有,默认是Integer.MAX_VALUE,不够的话就不打印,总共5个数字,这里就打印了第一组 0,1,2其余的就丢失了 。。。Flux> buffer = objectFlux.buffer(2);buffer.subscribe(System.out::println);System.out.println("n++++++++++++++++++");print(objectFlux.map(x -> x + 100));System.out.println("n++++++++++++++++++");
 //        将其转成一个流,然后再合并print(objectFlux.flatMap(x -> Flux.just(x, 1, 2, 4)));System.out.println("n+++++++++++++++++++++++ startWith");
 //        以什么开头System.out.println("以什么开头");print(objectFlux.startWith(1,2,3));System.out.println("n ++++++++++++++");Flux.just(1,2,3).concatWith(Flux.just(2,3,4)).subscribe(System.out::println);System.out.println("++++++++++++++");Mono.just(11).concatWith(Flux.just(12,3)).subscribe(System.out::println);
 //concatWith好像对于create创建的不生效,这里只有just才生效,concatWith在末尾加入,这里封装了一层,这样就可以加入了System.out.println("++++++++++++");Flux.just(objectFlux).concatWith(Flux.just(Flux.just(1,2,33))).subscribe((x) -> {x.subscribe(System.out::println);});System.out.println("+++++++++++");objectFlux.concatWith(Flux.just(1,2,33)).subscribe(System.out::println);}
 

尚硅谷
https://www.bilibili.com/video/BV1Vf4y127N5?p=55

创建

在这里插入图片描述

在这里插入图片描述

map和flatmap的区别

public class Map_FlatMap {List eggs = new ArrayList<>();@Beforepublic void init() {// 第一箱鸡蛋eggs.add(new String[]{"鸡蛋_1", "鸡蛋_1", "鸡蛋_1", "鸡蛋_1", "鸡蛋_1"});// 第二箱鸡蛋eggs.add(new String[]{"鸡蛋_2", "鸡蛋_2", "鸡蛋_2", "鸡蛋_2", "鸡蛋_2"});}// 自增生成组编号static int group = 1;// 自增生成学生编号static int student = 1;/*** 把二箱鸡蛋分别加工成煎蛋,还是放在原来的两箱,分给2组学生*/@Testpublic void map() {eggs.stream().map(x -> Arrays.stream(x).map(y -> y.replace("鸡", "煎"))).forEach(x -> System.out.println("组" + group++ + ":" + Arrays.toString(x.toArray())));/*控制台打印:------------组1:[煎蛋_1, 煎蛋_1, 煎蛋_1, 煎蛋_1, 煎蛋_1]组2:[煎蛋_2, 煎蛋_2, 煎蛋_2, 煎蛋_2, 煎蛋_2]*/}/*** 把二箱鸡蛋分别加工成煎蛋,然后放到一起【10个煎蛋】,分给10个学生*/@Testpublic void flatMap() {eggs.stream().flatMap(x -> Arrays.stream(x).map(y -> y.replace("鸡", "煎"))).forEach(x -> System.out.println("学生" + student++ + ":" + x));/*控制台打印:------------学生1:煎蛋_1学生2:煎蛋_1学生3:煎蛋_1学生4:煎蛋_1学生5:煎蛋_1学生6:煎蛋_2学生7:煎蛋_2学生8:煎蛋_2学生9:煎蛋_2学生10:煎蛋_2*/}}
 

标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。