Reactor 中 Map 的内部工作原理。
![Map 内部工作原理](https://istack.dev59.com/6wxQ9.webp)
创建一个 Player
类。
@Data
@AllArgsConstructor
public class Player {
String name;
String name;
}
现在创建一些 Player
类的实例
Flux<Player> players = Flux.just(
"Zahid Khan",
"Arif Khan",
"Obaid Sheikh")
.map(fullname -> {
String[] split = fullname.split("\\s");
return new Player(split[0], split[1]);
});
StepVerifier.create(players)
.expectNext(new Player("Zahid", "Khan"))
.expectNext(new Player("Arif", "Khan"))
.expectNext(new Player("Obaid", "Sheikh"))
.verifyComplete();
需要理解的关键是,map() 操作是同步执行的,在源 Flux 中每个项目发布时进行映射。如果您想要异步执行映射,应该考虑使用 flatMap() 操作。
flatMap 内部的工作原理。
![flatMap 内部的工作原理。](https://istack.dev59.com/6sCq4.webp)
Flux<Player> players = Flux.just(
"Zahid Khan",
"Arif Khan",
"Obaid Sheikh")
.flatMap(
fullname ->
Mono.just(fullname).map(p -> {
String[] split = p.split("\\s");
return new Player(split[0], split[1]);
}).subscribeOn(Scheduler.parallel()));
List<Player> playerList = Arrays.asList(
new Player("Zahid", "Khan"),
new Player("Arif", "Khan"),
new Player("Obaid", "Sheikh"));
StepVerifier.create(players).expectNextMatches(player ->
playerList.contains(player))
.expectNextMatches(player ->
playerList.contains(player))
.expectNextMatches(player ->
playerList.contains(player))
.expectNextMatches(player ->
playerList.contains(player))
.verifyComplete();
在Flatmap()内部,会执行一个map()操作,将String转换为Player。此外,subcribeOn()表示每个订阅应在并行线程中进行。如果没有subscribeOn(),则flatmap()作为同步操作。
map用于同步、非阻塞、一对一的转换,而flatMap用于异步(非阻塞)、一对多的转换。
map
是同步的,而flatMap
则不是。但我也明白,我在map
中提供的函数是异步执行的,我不知道该使用哪一个。 - shreddingkotlin
吧?因为你的示例是用这种语言而不是 Java。 - Inego