Roy*_*ove 5 java functional-programming currying java-8
为了充分利用Java中的函数组合,我想讨论一些我常用的现有静态函数.一个完美的currying候选者是Apache Commons StringUtils.
对于一个具体的例子,让我们说,我想讨好的StringUtils.remove(String str, String remove)方法提供了调用的函数(比方说)removeCommas.
一种可能的实现是:
Function<String, String> removeCommas = s -> StringUtils.remove(s, ",");
Run Code Online (Sandbox Code Playgroud)
然而,这并不是一个问题.我希望能够使用方法引用操作符(例如StringUtils::remove)以更实用的方式实现这一点,但我无法弄清楚语法是什么样的.
思考?
shm*_*sel 11
你可以remove()像这样咖喱:
Function<String, Function<String, String>> remove = r -> s -> StringUtils.remove(s, r);
Function<String, String> removeCommas = remove.apply(",");
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢方法引用,则可以使用通用帮助方法来计算任何固定方法:
static <T, U, R> Function<T, Function<U, R>> curry(BiFunction<T, U, R> function) {
return a -> b -> function.apply(a, b);
}
// ...
Function<String, Function<String, String>> remove = curry(StringUtils::remove);
Run Code Online (Sandbox Code Playgroud)
请注意,此帮助程序遵循参数顺序,因此上述函数将在删除字符串之前捕获目标字符串.没有办法在方法参考中重新排序参数,因此您必须选择订单并坚持下去.