项目反应堆–解构元组

元组是简单的数据结构,其中包含一组固定的项目,每个项目具有不同的数据类型。

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> 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

你可能感兴趣的:(字符串,数据结构,python,java,php)