我想知道在Java中是否有任何方法可以做到这一点。我认为如果没有闭包的本机支持,这是不可能的。
发布于 2013-02-07 19:45:58
Java 8(2014年3月18日发布)支持currying。在the answer by missingfaktor中发布的示例Java代码可以重写为:
import java.util.function.*;
import static java.lang.System.out;
// Tested with JDK 1.8.0-ea-b75
public class CurryingAndPartialFunctionApplication
{
public static void main(String[] args)
{
IntBinaryOperator simpleAdd = (a, b) -> a + b;
IntFunction<IntUnaryOperator> curriedAdd = a -> b -> a + b;
// Demonstrating simple add:
out.println(simpleAdd.applyAsInt(4, 5));
// Demonstrating curried add:
out.println(curriedAdd.apply(4).applyAsInt(5));
// Curried version lets you perform partial application:
IntUnaryOperator adder5 = curriedAdd.apply(5);
out.println(adder5.applyAsInt(4));
out.println(adder5.applyAsInt(6));
}
}
..。这是相当不错的。就我个人而言,有了Java8,我认为没有理由使用Scala或Clojure等替代JVM语言。当然,它们提供了其他语言功能,但这还不足以证明过渡成本和较弱的IDE/工具/库支持是合理的。
发布于 2015-06-12 01:05:28
函数类型Javaslang和JDK都提供了现成的方法(我认为这是Cyclops Functions module中的一个疏忽),而JDKλ有一组静态方法来使用JDK函数和方法引用。例如。
Curry.curry4(this::four).apply(3).apply(2).apply("three").apply("4");
public String four(Integer a,Integer b,String name,String postfix){
return name + (a*b) + postfix;
}
消费者也可以买到“Consumers”。例如,要返回一个具有3个参数的方法,并且已经应用了其中的2个参数,我们将执行类似如下的操作
return CurryConsumer.curryC3(this::methodForSideEffects).apply(2).apply(2);
发布于 2014-06-12 02:46:47
可以用Java7 MethodHandles来模拟currying:http://www.tutorials.de/threads/java-7-currying-mit-methodhandles.392397/
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class MethodHandleCurryingExample {
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle sum = lookup.findStatic(Integer.class, "sum", MethodType.methodType(int.class, new Class[]{int.class, int.class}));
//Currying
MethodHandle plus1 = MethodHandles.insertArguments(sum,0,1);
int result = (int) plus1.invokeExact(2);
System.out.println(result); // Output: 3
}
}
https://stackoverflow.com/questions/6134278
复制相似问题