实例:
一般来说,在代码中获得一个request后,需要对request进行处理,request可以使一个很复杂的对象,在getContext方法中进行构建一个Flux<Context> 上下文对象.
本实例为了简化,request是一个List<String>
@Test
public void mapTest() {
List<String> request = Arrays.asList("abc", "abcd", "klg", "klgh", "wold");
Mono.just(request)
.flatMapMany(this::getContext)
.subscribe(System.out::println);
}
private Flux<Context> getContext(List<String> list){
// 模拟sink 创建出独立的flux对象,
Flux<Context> 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 final <R> Flux<R> flatMapMany(Function<? super T, ? extends Publisher<? extends R>> mapper)
入参为Function<T,Publisher<R>>, 返回值为 Flux<R>.
Function<List, Flux<Context>> function = (x)->{ return getContext(x); };
那么 R返回的类型可以使Mono也可以使Flux:
Function<List, Mono<Context>> function = (x)->{ return getMonoContext(x); };
@Test
public void mapTest() {
Mono.just("list")
.flatMapMany(this::getMonoContext)
.subscribe(System.out::println);
}
private Mono<Context> getMonoContext(String string) {
return Mono.just(new Context(string, 0));
}
而 flatMap方法:
public final <R> Mono<R> flatMap(Function<? super T, ? extends Mono<? extends R>> transformer)
入参为T, 返回值为 Mono<R>. flatMap的返回值是经过Mono包装过的.
所以通常的方法:
Function<String, Mono<String>> function = (x)->{ return Mono.just(a+" world"); };
Mono.just("hello").flatMap(a-> Mono.just(a+" world"))
.subscribe(System.out::println);
而map函数并没有进行Mono的转换,
public final <R> Mono<R> map(Function<? super T, ? extends R> mapper)
String 入参 ---> 返回值一定是一个普通对象的转换
Function<String, Mono<String>> function = (x)->{ return (a+" world") };
Mono<String> 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是动态绑定的。