尝试运行吧,OK,从堆转储(Heap Dump)中恢复 ?

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:2760) 
    at java.util.Arrays.copyOf(Arrays.java:2734) 
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167) 
    at java.util.ArrayList.add(ArrayList.java:351) 
    at Take25.integers(Take25.java:30) 
    at Take25.main(Take25.java:9)

  当Java输出后,Clojure如何处理函数,使该函数可返回到每一个int?

  Clojure如同所有真正的函数语言(与Java不同)具备懒散赋值特性。它(指clojure)不会计算不被使用的值。它可以远离这个,因为Clojure不像Java,它是真正函数式语言,可以假定变量不发生变异,使评价的顺序变得无关紧要。因此,Clojure可以执行优化,但是Java编译器却不能——这是为什么函数式编程在Java中是危险的原因。因为,Java不是真正的函数式语言,JIT和javac无法像在一个真正的函数式语言中积极且有效地优化函数构造对象,比如返回无穷个列表的标准函数计算,都是Java程序的死穴。这也是为什么函数式编程在Java中危险的原因。

  这里,也许你会反对我的观点,OK,你无须在Java中返回所有的整数列表(或者甚至是所有的ints);但是相信没人做到这一点。

  我们来一起看看比较现实的做法。这里我再次使用递归来计算而不是循环:

    public class Squares { 
    
    public static void main(String args[]) { 
    squareAndPrint(1, Integer.parseInt(args[0])); 
    } 
    
    public static void squareAndPrint(int n, int max) { 
    System.out.println(n * n); 
    if (max > n) { 
    squareAndPrint(n + 1, max); 
    } 
    } 
    
    }

  开始运行!

  很抱歉,堆栈溢出。这是为什么在XOM中我小心翼翼地使用循环,即使递归的地方十分清楚也不使用递归。否则,精心配置XML文档可能会造成XOM-using程序来转储核心。因此,避免在非函数式语言中进行大量递归,正如Java和C不仅仅是性能需求,也是安全方面的要求。

  写在后:

  我不是说函数式编程不好,也不是说函数式编程低效,其实,我热爱函数式编程。像我的同事认为函数式编程是自然、直观且美丽的编程风格,但当它作为一们语言比如为Haskell重新设计时,Java中函数语句的性能Bug能要了你的命。