纯函数和Java

时间:2016-12-27 10:44:49

标签: java lambda functional-programming

我对Java和纯函数有几点怀疑。据我所知,纯函数是这两个语句所具有的函数:

  1. 没有副作用。
  2. 给出相同的输入结果相同。
  3. 根据那个(以及作为一个例子),这个函数是纯粹的:

    int sum(int a, int b) { return a + b; }
    

    然而,这个功能会被认为是纯粹的吗?

    int sum(Person a, Person b) { return a.getAge() + b.getAge(); }
    

    我的猜测是否定的,因为结果会有所不同,具体取决于您作为参数传递给函数的Person对象。

    考虑到Java中的对象(以及一般的OO语言)隐藏信息,是否可以将涉及对象的任何函数视为纯粹的参数?

    另一个问题,语言/程序是否可以被认为是纯粹的,如果它的任何功能都不纯粹?

    考虑到所有这些,一个Java程序(相当复杂)可能只由纯函数组成(纯粹,可以这么说)还是只是不可能的东西?

    另一个问题,就编译器而言,lambda表达式只能使用final(或有效的最终)变量:

    // Correct
    int f = 0;
    IntStream.of(1,2,3).map(e -> e * f).forEach(System.out::println);
    
    // Compilation error
    int g = 0;
    IntStream.of(1,2,3).map(e -> e * g).forEach(System.out::println);
    g = 22;
    

    这段代码编译的情况怎么可能?

    // Correct
    int[] f = new int[]{ 0 };
    IntStream.of(1,2,3).map(e -> e * f[0]).forEach(System.out::println);
    f[0] = 25;
    

1 个答案:

答案 0 :(得分:0)

  

任何涉及对象作为参数的函数都可以被认为是纯粹的吗?

是的,如果参数是不可变的。

  

我的猜测是否定的,因为结果会有所不同,具体取决于您作为参数传递给函数的Person对象。

这不正确的原因。但是同一个对象在不同的​​时间点可以有不同的年龄。

  

如果某个语言/程序的任何功能不纯粹,那么它是否可以被认为是纯粹的?

我不确定,但我回答为“否”,因为pure的含义被这个不纯的功能所蔑视。

  

这段代码编译的情况怎么可能?

因为参考是最终的。