元组是简单的数据结构,其中包含一组固定的项目,每个项目具有不同的数据类型。
Project Reactor提供了可以容纳大约8种不同类型的元组数据结构 。
元组非常有用,但是使用元组的问题之一是,要在不使用它们的每个位置对其进行结构分解的情况下,很难弄清它们的内容。
问题
考虑一个简单的运算符,该运算符以这种方式将字符串和整数压缩在一起:
Mono> tup = Mono.zip(Mono.just( "a" ), Mono.just( 2 ))
输出是包含2个元素的元组。
现在,我的问题是这个。 我希望在对它进行任何操作之前,先将其取消引用到其组成元素中。
用上一个元组说,我想生成与count(元组的第二个元素)一样多的字符串(元组的第一个元素),表示方式如下:
Mono.zip(Mono.just( "a" ), Mono.just( 2 ))
.flatMapMany(tup -> {
return Flux.range( 1 , tup.getT2()).map(i -> tup.getT1() + i);
})
这里的问题是,当引用“ tup.getT1()”和“ tup.getT2()”时,并不清楚元组的含义。 虽然更冗长,但我更喜欢这样做:
Mono.zip(Mono.just( "a" ), Mono.just( 2 ))
.flatMapMany(tup -> {
String s = tup.getT1();
int count = tup.getT2();
return Flux.range( 1 , count).map(i -> s + i);
});
解
将结构分解为具有有意义名称的显式变量的方法可行,但这有点冗长。 使用Project Reactor附带的一组实用工具提供了一种更好的方法
元组
我觉得最好用一个示例来解释,使用TupleUtils之前的解构看起来像这样:
Mono.zip(Mono.just( "a" ), Mono.just( 2 ))
.flatMapMany(TupleUtils.function((s, count) ->
Flux.range( 1 , count).map(i -> s + i)))
这看起来比显式解构更为简洁。 有点聪明,但需要一些习惯:
flatMapMany的签名是–
public final Flux flatMapMany(Function super T,? extends Publisher extends R>> mapper)
TupleUtils提供了另一个间接函数,它通过另一个函数返回上述所需的函数:
public static Function, R> function(BiFunction function) {
return tuple -> function.apply(tuple.getT1(), tuple.getT2()); }
如果您使用的是Kotlin,则有一种更简单的方法。 这基于“解构声明”的概念。 Project Reactor使用额外的gradle依赖项提供了一组Kotlin帮助器实用程序:
implementation( "io.projectreactor.kotlin:reactor-kotlin-extensions" )
有了这种依赖关系后,等效的Kotlin代码如下所示:
Mono.zip(Mono.just( "a" ), Mono.just( 2 ))
.flatMapMany { (s: String, count: Int) ->
Flux.range( 1 , count).map { i: Int -> s + i } Flux.range( , count).map { i: Int -> s + i }
}
了解如何将元组直接分解为变量。 看起来是这样的:
val (s: String, count: Int) = tup
结论
重要的是,将元组分解为更有意义的变量以提高代码的可读性,并且TupleUtils和Kotlin扩展提供的有用功能有助于保持代码的简洁性和可读性。
Java示例在这里 ,Kotlin示例在这里
翻译自: https://www.javacodegeeks.com/2020/01/project-reactor-de-structuring-a-tuple.html