实例:
一般来说,在代码中获得一个request后,需要对request进行处理,request可以使一个很复杂的对象,在getContext方法中进行构建一个Flux
本实例为了简化,request是一个List
@Test
public void mapTest() {
List request = Arrays.asList("abc", "abcd", "klg", "klgh", "wold");
Mono.just(request)
.flatMapMany(this::getContext)
.subscribe(System.out::println);
}
private Flux getContext(List list){
// 模拟sink 创建出独立的flux对象,
Flux stringFlux = Flux.create(sink -> {
for (String string : list) {
sink.next(new Context(string,0));
}
sink.complete();
});
stringFlux.subscribe(System.out::println);
return stringFlux;
}
@Data
@AllArgsConstructor
class Context{
String data;
int status;
}
, 当然你也可以用Mono.just(list)来构建。本文的例子只是为了构建工程应用中的上下文对象。
先看flatMapMany 的入参和返回值:
public finalFlux flatMapMany(Function super T, ? extends Publisher extends R>> mapper)
入参为Function
Function> function = (x)->{ return getContext(x); };
那么 R返回的类型可以使Mono也可以使Flux:
Function> function = (x)->{ return getMonoContext(x); };
@Test
public void mapTest() {
Mono.just("list")
.flatMapMany(this::getMonoContext)
.subscribe(System.out::println);
}
private Mono getMonoContext(String string) {
return Mono.just(new Context(string, 0));
}
而 flatMap方法:
public finalMono flatMap(Function super T, ? extends Mono extends R>> transformer)
入参为T, 返回值为 Mono
所以通常的方法:
Function
Mono.just("hello").flatMap(a-> Mono.just(a+" world"))
.subscribe(System.out::println);
而map函数并没有进行Mono的转换,
public finalMono map(Function super T, ? extends R> mapper)
String 入参 ---> 返回值一定是一个普通对象的转换
Function
Mono monoMap = Mono.just("hello").map(a -> a + " world");
monoMap.subscribe(System.out::println);
对于普通int 的来说map 和 flatMap打印结果并没有什么不同,如下:
Mono.just(1).flatMap(a-> Mono.just(a+2))
.subscribe(System.out::println);
Mono.just(1).map(a->a+2).subscribe(System.out::println);
异步的转换发布的元素并返回一个新的Mono,被转换的元素和新Mono是动态绑定的。