【问题标题】:What does it mean that functions can be used as inputs or be returned from other functions?函数可以用作输入或从其他函数返回是什么意思?
【发布时间】:2018-04-22 06:15:12
【问题描述】:

这个语句在函数式编程中是什么意思:

函数可以用作输入,也可以作为其他函数的输出返回"

我们也可以在简单的编程中使用函数作为输入。例如:

public int getaddition(int a,int b)  {
    return a+b;
} 

我们可以这样称呼:

getaddition(getFirstNumber(),getSecondNumber())

谁能解释一下这个说法?我没有真正理解这个定义。

编辑 - 感谢所有答案。我得到了答案,但我对这个关于函数式编程的陈述还有一个困惑 -

对于给定的输入,它总是返回相同的输出。

【问题讨论】:

    标签: java lambda java-8 functional-programming


    【解决方案1】:
    int getaddition(int a,int b)
    ^^^             ^^^   ^^^
    

    这里getaddition 的输入和输出都是简单的整数。

    getaddition(getFirstNumber(),getSecondNumber()) 不会将函数传递给getaddition,它会传递调用函数的结果,它只是一个数字。

    引用所指的是将函数本身作为值传递的能力。例如,在 JavaScript 中,您可以过滤值数组:

    const numbers = [ 1, 2, 3, 99, 42, 78, 15, 14, 13 ];
    const evens = numbers.filter(function (x) { return x % 2 == 0; });
    console.log(evens);

    .filter 将函数作为参数。它反复调用此函数以确定要保留哪些元素。

    【讨论】:

      【解决方案2】:

      您的代码 sn-p 没有演示“函数可以用作输入或作为其他函数的输出返回”语句。您的getaddition 方法接受int 参数并返回int。您将其他方法调用返回的 int 值传递给它,您没有将任何函数传递给它。

      将函数作为输入传递给方法意味着传递实现某些功能接口的类的实例。

      例如:

      public static int applyOperation(BinaryOperator<Integer> op,int a,int b)  {
          return op.apply (a, b);
      }
      

      您可以将执行加法的函数传递给该方法:

      int result = applyOperation ((a,b) -> a + b, 4, 5);
      

      结果是 9。

      您还可以将执行乘法的函数传递给该方法:

      int result = applyOperation ((a,b )-> a * b, 4, 5);
      

      结果是 20。

      从方法返回函数意味着该方法的返回类型将是某个函数接口。

      例如,这里有一个方法,它返回一个执行加法的功能接口:

      public static BinaryOperator<Integer> addition() {
          return (a,b) -> a + b;
      }
      

      您可以将该函数传递给之前定义的方法:

      int result = applyOperation (addition(), 4, 5)
      

      【讨论】:

      • 我可以建议将addition() 重命名为getOperation() 并让它采用"+""*" 并返回一个函数以进行相加或相乘(或为任何其他输入抛出异常)。我认为这仍然非常简单,并且会真正展示返回一个函数。
      【解决方案3】:

      我相信这句话是关于 FP 的一个重要特征:Higher-order function

      在函数的特定方面可以作为参数传递,我想在 Java 中对其进行采样(作为您示例的语言)。我们以Collections.sort 为例,假设我们要使用自定义比较器对People 对象列表进行排序,在Java8 之前,必须传递Comparator 对象。

             Collections.sort(list, new Comparator<People>() {
                  @Override
                  public int compare(People o1, People o2) {
                      return o1.name.compareTo(o2.name);
                  }
              });
      

      代码看起来并不优雅,我们要传递的是行为,即o1.name.compareTo(o2.name),而不是对象。但是作为 OOP 的边界,我们只能传递对象,因此,对象包装器是传递行为的一种变通方法。这在 Java8 中得到了改进,我们可以在其中传递一个行为:

             public int comparePerson(People o1, People o2) {
                      return o1.name.compareTo(o2.name);
                  }
             Collections.sort(list, comparePerson);
      

      在示例中,我们将函数作为参数传递给Collections.sort。我们甚至可以传递一个“匿名”函数,AKA lambda。

      Collections.sort(list, (o1, o2) -> o1.name.compareTo(o2.name));
      

      Ps:最后,尽管 Java 8 有所改进,Java 并不是 FPL。一个简单的例子是,每个参数都必须声明为某种“类型”,例如ComparatorBiFunction。名称函数类型或FunctionalInterface 使它听起来像一个函数。确实不是。接口是对象行为的蓝图。简而言之,与对象不同,函数不是 Java 中的一等公民。 看看Scala,你可以声明一个函数参数为(String, String) =&gt; Int,一个纯函数令牌。

      【讨论】:

        【解决方案4】:

        在函数式编程中,函数被视为与任何其他值一样。这意味着它们可以作为参数传递,也可以从方法中返回。

        例如,下面的方法接受一个函数,并返回另一个与输入函数返回的结果相乘的函数:

        public Function<Integer, Integer> multiply2(Function<Integer, Integer> function) {
            return i -> function.apply(i) * 2;
        }
        

        请记住,这些计算并未实际执行。这只是我们意志的表达。

        如果你想要一个动作发生,你需要显式调用它的方法:

        Function<Integer, Integer> function = multiply2(i -> i + 1);
        function.apply(42);
        

        【讨论】:

          【解决方案5】:

          从其他答案中可以清楚地看出,您显示的方法不是higher order function,因为它既不接受函数也不返回函数。

          转到您的问题:

          这个语句在函数式编程中是什么意思?

          函数可以用作输入,也可以作为其他函数的输出返回 功能

          由于 Java 语言支持first-class functions。我们说一等函数是将函数本身视为对象,这意味着我们可以将函数作为参数传递给另一个函数,从函数返回函数,将函数存储在变量中,或将它们存储在数据结构中。

          是的,这听起来很模糊;那么用 Java 术语来说,这到底是什么意思?

          它只是意味着一个方法是否有任何functional interface 作为其参数或返回值,例如Function&lt;T, R&gt;Predicate&lt;T&gt;Supplier&lt;T&gt; 等,那么该方法是 higher order function,这就是上面引用的意思。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-13
            相关资源
            最近更新 更多