Flux.concat 和 Flux.concat 之间的区别
Difference between Flux.concat and Flux.concatWith
我是反应流的新手,正在学习使用 concat/concatWith 方法组合两个发布者(具体来说是 Flux)。
我可以用 concat 方法做的所有事情,同样可以使用 concatWith 方法来实现。这是我使用的示例案例:
Mono<String> mono1 = Mono.just(" karan ");
Mono<String> mono2 = Mono.just(" | verma ");
Mono<String> mono3 = Mono.just(" | kv ");
Flux<String> flux1 = Flux.just(" {1} ","{2} ","{3} ","{4} " );
Flux<String> flux2 = Flux.just(" |A|"," |B| "," |C| ");
// FLux emits item each 500ms
Flux<String> intervalFlux1 = Flux.interval(Duration.ofMillis(1000))
.zipWith(flux1, (i, string) -> string);
// FLux emits item each 700ms
Flux<String> intervalFlux2 = Flux
.interval(Duration.ofMillis(1000))
.zipWith(flux2, (i, string) -> string);
System.out.println("**************Flux Concat***************");
Flux.concat(mono1, mono2, mono3).subscribe(System.out::print);
System.out.println();
Flux.concat(flux2, flux1).subscribe(System.out::print);
System.out.println();
Flux.concat(intervalFlux2, flux1).subscribe(System.out::print);
Thread.sleep(5000);
System.out.println();
Flux.concat(intervalFlux2, intervalFlux1).subscribe(System.out::print);
Thread.sleep(10000);
System.out.println("----------------------------------------");
System.out.println("**************Flux Concat with***************");
mono1.concatWith(mono2).concatWith(mono3).subscribe(System.out::print);
System.out.println();
flux1.concatWith(flux2).subscribe(System.out::print);
System.out.println();
intervalFlux1.concatWith(flux2).subscribe(System.out::print);
Thread.sleep(5000);
System.out.println();
intervalFlux1.concatWith(intervalFlux2).subscribe(System.out::print);
Thread.sleep(10000);
System.out.println();
System.out.println("----------------------------------------");
这是两种情况的输出:
**************Flux Concat***************
karan | verma | kv
|A| |B| |C| {1} {2} {3} {4}
|A| |B| |C| {1} {2} {3} {4}
|A| |B| |C| {1} {2} {3} {4} ----------------------------------------
**************Flux Concat with***************
karan | verma | kv
{1} {2} {3} {4} |A| |B| |C|
{1} {2} {3} {4} |A| |B| |C|
{1} {2} {3} {4} |A| |B| |C|
----------------------------------------
两种情况的时间复杂度也相似。
两者有什么区别?
是否有任何特定条件,何时应使用 concat 或 concatWith?
它们是等价的
Java 要求所有代码都是 class 的一部分,所以你不能只将 Flux concat(Flux, Flux)
作为一个自由函数,imo 将是最不容易混淆的。
有些人喜欢 "always member functions",有些人喜欢 "static functions when taking two (or more) of same class"。
第三种选择是 Flux::Flux(Flux, Flux)
(或 Flux::Flux(Flux[])
)
形式的构造函数
我是反应流的新手,正在学习使用 concat/concatWith 方法组合两个发布者(具体来说是 Flux)。
我可以用 concat 方法做的所有事情,同样可以使用 concatWith 方法来实现。这是我使用的示例案例:
Mono<String> mono1 = Mono.just(" karan ");
Mono<String> mono2 = Mono.just(" | verma ");
Mono<String> mono3 = Mono.just(" | kv ");
Flux<String> flux1 = Flux.just(" {1} ","{2} ","{3} ","{4} " );
Flux<String> flux2 = Flux.just(" |A|"," |B| "," |C| ");
// FLux emits item each 500ms
Flux<String> intervalFlux1 = Flux.interval(Duration.ofMillis(1000))
.zipWith(flux1, (i, string) -> string);
// FLux emits item each 700ms
Flux<String> intervalFlux2 = Flux
.interval(Duration.ofMillis(1000))
.zipWith(flux2, (i, string) -> string);
System.out.println("**************Flux Concat***************");
Flux.concat(mono1, mono2, mono3).subscribe(System.out::print);
System.out.println();
Flux.concat(flux2, flux1).subscribe(System.out::print);
System.out.println();
Flux.concat(intervalFlux2, flux1).subscribe(System.out::print);
Thread.sleep(5000);
System.out.println();
Flux.concat(intervalFlux2, intervalFlux1).subscribe(System.out::print);
Thread.sleep(10000);
System.out.println("----------------------------------------");
System.out.println("**************Flux Concat with***************");
mono1.concatWith(mono2).concatWith(mono3).subscribe(System.out::print);
System.out.println();
flux1.concatWith(flux2).subscribe(System.out::print);
System.out.println();
intervalFlux1.concatWith(flux2).subscribe(System.out::print);
Thread.sleep(5000);
System.out.println();
intervalFlux1.concatWith(intervalFlux2).subscribe(System.out::print);
Thread.sleep(10000);
System.out.println();
System.out.println("----------------------------------------");
这是两种情况的输出:
**************Flux Concat***************
karan | verma | kv
|A| |B| |C| {1} {2} {3} {4}
|A| |B| |C| {1} {2} {3} {4}
|A| |B| |C| {1} {2} {3} {4} ----------------------------------------
**************Flux Concat with***************
karan | verma | kv
{1} {2} {3} {4} |A| |B| |C|
{1} {2} {3} {4} |A| |B| |C|
{1} {2} {3} {4} |A| |B| |C|
----------------------------------------
两种情况的时间复杂度也相似。
两者有什么区别? 是否有任何特定条件,何时应使用 concat 或 concatWith?
它们是等价的
Java 要求所有代码都是 class 的一部分,所以你不能只将 Flux concat(Flux, Flux)
作为一个自由函数,imo 将是最不容易混淆的。
有些人喜欢 "always member functions",有些人喜欢 "static functions when taking two (or more) of same class"。
第三种选择是 Flux::Flux(Flux, Flux)
(或 Flux::Flux(Flux[])
)