首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java支持Currying吗?

Java支持Currying吗?
EN

Stack Overflow用户
提问于 2011-05-26 13:54:48
回答 11查看 36.5K关注 0票数 93

我想知道在Java中是否有任何方法可以做到这一点。我认为如果没有闭包的本机支持,这是不可能的。

EN

回答 11

Stack Overflow用户

发布于 2013-02-07 19:45:58

Java 8(2014年3月18日发布)支持currying。在the answer by missingfaktor中发布的示例Java代码可以重写为:

代码语言:javascript
复制
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/工具/库支持是合理的。

票数 148
EN

Stack Overflow用户

发布于 2015-06-12 01:05:28

函数类型Javaslang和JDK都提供了现成的方法(我认为这是Cyclops Functions module中的一个疏忽),而JDKλ有一组静态方法来使用JDK函数和方法引用。例如。

代码语言:javascript
复制
  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个参数,我们将执行类似如下的操作

代码语言:javascript
复制
 return CurryConsumer.curryC3(this::methodForSideEffects).apply(2).apply(2);

Javadoc

票数 16
EN

Stack Overflow用户

发布于 2014-06-12 02:46:47

可以用Java7 MethodHandles来模拟currying:http://www.tutorials.de/threads/java-7-currying-mit-methodhandles.392397/

代码语言:javascript
复制
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
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6134278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档