如何实现可接收任意数量函数的递归链式泛型方法?
如何让Java的chain方法支持任意数量的函数参数?
我希望能写出这样的调用代码:
var output = chain( 0, n -> n + "hi", n -> n, n -> n + 1, n -> n.equals("0hi1") );
现在需要解决的问题是:如何让chain方法支持接收任意数量的函数参数?
目前我能通过定义固定数量泛型参数的方法实现,但这种方式对传入的函数数量有严格限制,无法灵活扩展:
public static <A, B, C, D, E> E chain( A val, Function<? super A, ? extends B> f1, Function<? super B, ? extends C> f2, Function<? super C, ? extends D> f3, Function<? super D, ? extends E> f4 ) { return f4.apply(f3.apply(f2.apply(f1.apply(val)))); }
我考虑过用递归结合可变参数的方式实现,大致思路如下,但还需要完善泛型类型的处理:
public static OutputType chain( InputType val, Function<?, ?>... functions ) { var nextInput = functions[0].apply(val); if (functions.length == 1) return nextInput; var tail = Arrays.copyOfRange(functions, 1, functions.length); return chain(nextInput, tail); }
另外我知道可以通过Optional、Stream这类Monad实现链式转换,示例代码如下:
var output = Optional .of(0) .map(n -> n + "hi") .map(n -> n) .map(n -> n + 1) .map(n -> n.equals("0hi1")) .get();
但我明确不想采用这类方案,希望保持最开始的chain(val, func1, func2, ...)这种调用风格。
内容的提问来源于stack exchange,提问作者Igor Flakiewicz
相关产品推荐
相关产品推荐

