相关文章推荐
睿智的松鼠  ·  HTTP客户端之Spring ...·  6 天前    · 
沉着的热水瓶  ·  module 'torch' has no ...·  2 年前    · 

环境信息:
JDK: Java 8
Reactor: Reactor 3.2.10.RELEASE

Gradle依赖:

compile group: 'io.projectreactor', name: 'reactor-core', version: '3.2.10.RELEASE'
compile 'ch.qos.logback:logback-classic:1.2.1'
testCompile 'io.projectreactor.addons:reactor-test'
testCompile 'junit:junit:4.12'

这几个代码的效果都一样,打印出11;

Mono.just("1").map(a -> a + "1").subscribe(System.out::println);
Mono.just("1").flatMap(a -> Mono.just(a + "1")).subscribe(System.out::println);
Flux.just("1").map(a -> a + "1").subscribe(System.out::println);
Flux.just("1").flatMap(a -> Flux.just(a + "1")).subscribe(System.out::println);

1 Mono

1.1 map()

Mono<String> monoMap = Mono.just("1").map(a -> a + "1");
monoMap.subscribe(System.out::println);

同步的转换发布的元素并返回。

1.2 flatMap()

Flux<String> monoFlatMap = Mono.just("1").flatMap(a -> Mono.just(a + "1"));
monoFlatMap.subscribe(System.out::println);

异步的转换发布的元素并返回一个新的Mono,被转换的元素和新Mono是动态绑定的。

2 Flux

2.1 map()

Mono<String> fluxMap = Flux.just("1").map(a -> a + "1");
fluxMap.subscribe(System.out::println);

同步的转换发布的元素并返回,转换完后被转换元素被丢弃。

2.2 flatMap()

Flux<String> fluxFlatMap = Flux.just("1").flatMap(a -> Flux.just(a + "1"));
fluxFlatMap.subscribe(System.out::println);

异步的转换发布的元素并他们展开合并到一个新的Flux并返回。

这两个在本质上是一样的,都是 map 操作,即对流形式的传入数据进行处理返回一个数据。但是区别方面从字面上就可以体现出来,flatMapmap 多了一个 flat 操作,也就是 “展平/扁平化” 处理的意思。 所以 flatMap 是一个 map 和一个 flat 操作的组合。其首先将一个函数应用于元素,然后将其展平,当你需要将 [[a,b,c],[d,e,f],[x,y,z]] 具有两个级别的数据结构转换为 [a,b,c,d,e,f,x,y,z] 这样单层的数据结构时,就选择使用 flatMa map takes a Function<T, U> and returns a Flux flatMap takes a Function<T, Publisher> and returns a Flux 中文译文: map 接受Function <T,U>并返回Flux flatMap 接受Functi 假如我们有这样一个需求给定单词列表["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"],如果我们使用java实现这个需求,你会怎么实现呢?可能我们第一个想法是下面这种写法: words.stream() .map(word -> word.split("")) .distinct() .collect(toList()); 但是如果我们运行会发现这样的写法是不正确的,这个方法的问题在于,传递给map方法的Lambda为每个单词返回 异常堆栈信息示例 java.lang.NullPointerException: null at com.fdd.op.common.exception.GlobalExceptionHandler.resolveException(GlobalExceptionHandler.java:222) at com.fdd.op.gateway.server.exception.JsonExceptionHandler.handle(JsonExceptionHandl 本文通过自己实现接口的方式,揭示了响应式编程核心类 Mono 的基本原理。其核心接口为三个 Publisher,Subscriber,Subsription。核心方法为 Publisher#onSubscribe(Subscription),Subscriber#onSubscribe(Subscription),Subsription#request(long), Subscriber#onNext(T) https://stackoverflow.com/questions/56496426/project-reactor-mono-map-vs-mono-flatmap Mono#flatMap takes a Function that transforms a value into another Mono. That Mono could represent some asynchrono... 适合阅读的人群:本文适合对 Spring、Netty 等框架,以及 Java 8 的 Lambda、Stream 等特性有基本认识,希望了解 Spring 5 的反应式编程特性的技术人员阅读。一、前言最近几年,随着 Node.js、Golang 等新技术、新语言的出现,Java 的服务器端开发语言老大的地位受到了不小的挑战。虽然,Java 的市场份额依旧很大,短时间内也不会改变,但 Java 社区...