关于java柯里化的问题

public class CurringTest {
  public static void main(String[] args) {
    IntFunction<Integer> currPrice = curring(items ->
            Long.valueOf(items.stream()
                    .mapToLong(i -> Long.valueOf(i))
                    .sum())
                    .intValue()
    );

    currPrice.apply(1);
    currPrice.apply(2);
    int result = currPrice.apply(Integer.MAX_VALUE);
    System.out.println(result);
  }

  public static IntFunction<Integer> curring(Function<List<Integer>, Integer> fn) {
    final List<Integer> result = new ArrayList<>();

    return arg -> {
      if (arg != Integer.MAX_VALUE) {
        result.add(arg);
      } else {
        //当输入INT最大值时进行计算
        return fn.apply(result);
      }
      return null;
    };
  }
}

输出结果是3,我想知道result作为一个局部变量是如何保存值的。

阅读 3.2k
2 个回答

这个类似于JS的闭包概念,curring()在执行完毕之后,其活动对象也不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,当curring()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中,直到匿名函数被销毁后,curring()的活动对象才会被销毁

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

clipboard.png
dubug可以发现,调用curring()方法获取currPrice对象时,函数内部相当于将result设为currPrice函数的一个成员变量,这时currPrice对象已经不会变了,每次apply只时调用currPrice对象的fn方法,所以result可以把apply的值保存下来,再具体的原理就不清楚了,希望有大神解答。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题