使用reduce组合函数
Posted
技术标签:
【中文标题】使用reduce组合函数【英文标题】:Combine Function using reduce 【发布时间】:2020-03-26 04:57:54 【问题描述】:我正在尝试使用以下代码使用reduce函数来组合函数:
class CustomClass
private Function<Map<String, String>, Integer> cal;
public CustomClass (Function<Map<String, String>, Integer>... func)
cal = Stream.of(func)
.reduce(Function.identity(), Function::andThen);
但我收到此错误:
The method reduce(Function<Map<String,String>,Integer>, BinaryOperator<Function<Map<String,String>,Integer>>)
in the type Stream<Function<Map<String,String>,Integer>> is not applicable
for the arguments (Function<Object,Object>, Function::andThen)
我在这里做错了什么?
【问题讨论】:
【参考方案1】:如果第一个函数的结果与第二个函数所需的参数匹配,则只能组合两个函数。在您的示例中并非如此,因为您的 Function
s 接受 Map<String, String>
,但返回 Integer
。您不能将 Integer
作为参数传递给下一个 Function
。
如果您更改了Function
s 的签名,您的代码将通过编译。
例如:
class CustomClass
private Function<Map<String, String>, Map<String, String>> cal;
public CustomClass (Function<Map<String, String>, Map<String, String>>... func)
cal = Stream.of(func)
.reduce(Function.identity(), Function::andThen);
和
class CustomClass
private Function<Integer,Integer> cal;
public CustomClass (Function<Integer,Integer>... func)
cal = Stream.of(func)
.reduce(Function.identity(), Function::andThen);
都通过编译。
【讨论】:
知道了,我会根据要求修改代码 @vaydesalme 除了问题本身未说明的要求。从逻辑上考虑,根据输入和输出类型链接多个Function<Map<String, String>, Integer>
是否有意义?你甚至需要可变参数吗?以上是关于使用reduce组合函数的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中为Hadoop Map Reduce作业编写组合器和分区器?我如何在Hadoop Job中调用它
我正在尝试使用 reduce... 重新组合一组数组,但失败了
F#:啥叫做 map 和 fold 的组合,或者 map 和 reduce 的组合?
组合器在 java parallelStream reduce 中的实际作用是啥