概念
背压机制
在生产者和消费者模型中,消费者除了消费生产者的数据之外,还需要一种向生产者反馈流量需求的机制,这个机制就是背压机制
不允许 Mono.just(null)会抛出空指针异常,Mono.justorEmpty(entity)这样就不会了,如果是null,就相当于Mono.empty().
Flux对象的创建
@Test
public 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<Integer> 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<Integer> 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();
}
消费:
@Test
public void midoperate() {
Flux<Integer> objectFlux = Flux.create((sink) -> {
for (int i = 0; i < 5; i++) {
sink.next(i);
}
}
);
// 需要注意的是buffe中的cap一定要有,默认是Integer.MAX_VALUE,不够的话就不打印,总共5个数字,这里就打印了第一组 0,1,2其余的就丢失了 。。。
Flux<List<Integer>> 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<String[]> eggs = new ArrayList<>();
@Before
public 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组学生
*/
@Test
public 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个学生
*/
@Test
public 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
*/
}
}