transform
transform的功能,如果用过jdk8的stream的话,应该没什么难度,和stream的用法几乎一致。
我们可以通过map来对flux/mono的结果进行转换,看下面的例子:
1 2 3 |
Flux.just(new User("aaa")) .map(u -> new User(u.getName().toUpperCase())) .subscribe(System.out::println); |
这里面User对象包含一个name字段,我们通过map方法对其中的内容进行了转换,和stream中的使用完全一致,但是一般在jdk8的stream中,我们一般是会用map做实际的类型转换,如果只是像上述一样把name转为大写而不改变列表结果的话,stream是提供了一个专门的peek方法可以处理的,但是在reactor3里面是没有这个方法的,稍显笨拙。
在reactor中有两个方法可以进行类型转换,一个是map,另外一个是flatMap,map用于同步,flatMap用于异步处理,如果我们的转换方法是个rpc或者其他的外部接口调用(当然本地接口也可以使用),那我们就应该用flatMap这个异步方法来处理,调用起来没有任何区别,这里就不写示例了。
merge
字面意义应该就是到,merge就是把多个Publisher合并,直接看示例吧。
1 2 3 4 5 |
Flux<String> flux = Flux.just("a").delayElements(Duration.ofSeconds(1)); Flux<String> flux2 = Flux.just("b"); flux.mergeWith(flux2).subscribe(System.out::println); Thread.sleep(3000); |
最后的sleep只是为了让我们可以看到结果而不是代码直接结束。
通过mergeWith方法,可以把两个Publisher合并,但是这里注意到,flux产生的a,会有个1秒的延迟,所以实际上的打印结果是b、a,我们要想让他完全按照顺序打印怎么办呢?可以用concatWith方法,这个方法是会等1秒a打印了之后再打印b,也就是有序处理。
另外,mergeWith和concatWith两个方法的参数都是Publisher,也就是说,通过这两个方法是可以把mono合并为Flux的,示例如下:
1 2 |
Mono.just("1").concatWith(Mono.just("2")).subscribe(System.out::println); Mono.just("1").mergeWith(Mono.just("2")).subscribe(System.out::println); |
©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: 响应式编程的transform与merge