这个陈述在函数式编程中的含义是什么:
函数可用作输入或作为其他函数的输出返回“
我们还可以在简单编程中使用函数作为输入。例如:
public int getaddition(int a,int b) {
return a+b;
}
我们可以将其称为:
getaddition(getFirstNumber(),getSecondNumber())
有人可以解释这个陈述吗?我并没有真正得到这个定义。
编辑 - 感谢所有答案。我得到了答案,但我对这个关于函数式编程的陈述更加困惑 -
始终为给定输入返回相同的输出。
答案 0 :(得分:4)
您的代码段并未演示"函数可用作输入或作为其他函数的输出返回"声明。您的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)
答案 1 :(得分:4)
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);
&#13;
.filter
将函数作为参数。它反复调用此函数来确定要保留的元素。
答案 2 :(得分: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
。我们甚至可以传递一个匿名的&#34;功能,AKA lambda。
Collections.sort(list, (o1, o2) -> o1.name.compareTo(o2.name));
Ps:最后,Java并不是FPL的Java 8改进版。一个简单的例子就是每个参数都必须声明为某些&#34;类型&#34;,例如Comparator
或BiFunction
。名称函数类型或FunctionalInterface
使其听起来像一个函数。事实并非如此。接口是对象行为的蓝图。简而言之,与对象不同,函数不是Java中的第一类citicen。
看看Scala,你可以将函数参数声明为(String, String) => Int
,一个纯函数标记。
答案 3 :(得分:2)
在功能编程中,函数被视为与任何其他值一样。这意味着它们可以作为参数传递,也可以从方法返回。
例如,以下方法接受一个函数并返回另一个函数,该函数将输入函数返回的结果相乘:
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);
答案 4 :(得分:1)
从其他答案中可以清楚地看出,你所展示的方法不是higher order function,因为它不需要函数也不会返回函数。
转到你的问题:
这个陈述在函数式编程中的含义是什么?
函数可用作输入或作为其他函数的输出返回 功能
由于Java语言支持first-class functions。我们说第一类函数是被视为对象本身的函数,这意味着我们可以将函数作为参数传递给另一个函数,从函数返回函数,将函数存储在变量中,或者将它们存储在数据结构中。
对,这听起来可能含糊不清;所以在Java术语中这究竟意味着什么?
它只是意味着方法是否有functional interface作为其参数或返回值,例如Function<T, R>
,Predicate<T>
,Supplier<T>
等等,那个方法是higher order function,这就是上面引用的内容。