在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 關(guān)于java柯里化的問題

關(guān)于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 {
        //當(dāng)輸入INT最大值時進(jìn)行計算
        return fn.apply(result);
      }
      return null;
    };
  }
}

輸出結(jié)果是3,我想知道result作為一個局部變量是如何保存值的。

回答
編輯回答
疚幼

柯里化(Currying)是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的參數(shù)且返回結(jié)果的新函數(shù)的技術(shù)。

clipboard.png
dubug可以發(fā)現(xiàn),調(diào)用curring()方法獲取currPrice對象時,函數(shù)內(nèi)部相當(dāng)于將result設(shè)為currPrice函數(shù)的一個成員變量,這時currPrice對象已經(jīng)不會變了,每次apply只時調(diào)用currPrice對象的fn方法,所以result可以把a(bǔ)pply的值保存下來,再具體的原理就不清楚了,希望有大神解答。

2017年2月14日 02:55
編輯回答
鹿惑

這個類似于JS的閉包概念,curring()在執(zhí)行完畢之后,其活動對象也不會被銷毀,因為匿名函數(shù)的作用域鏈仍然在引用這個活動對象。換句話說,當(dāng)curring()函數(shù)返回后,其執(zhí)行環(huán)境的作用域鏈會被銷毀,但它的活動對象仍然會留在內(nèi)存中,直到匿名函數(shù)被銷毀后,curring()的活動對象才會被銷毀

2017年10月12日 12:03