将过程视为“一等”的语言允许像传递任何其他值一样传递函数。
像Java 7(及更早版本)和C这样的语言“有点”具有这种能力:C允许函数指针传递,但你不能用这些语言动态定义一个函数,然后突然把它传递到其他地方。版本8之前的Java可以在一定程度上用匿名类来模拟这一点,但从技术上讲,它没有一流的函数。
另一方面,C++,D,C#,Visual Basic .NET,Java 8 +和函数式语言(如Scheme和Haskell)确实允许您传递变量等函数。例如,下面的代码返回一个添加到其输入的函数:addend
用 D 语言编写:
int delegate(int) makeAdder(int addend) //Returns a function
{
return delegate int(int x) //Long way
{
return x + addend; //Notice that addend came from _outside_ the function
};
return (int x) { return x + addend; }; //Short way
return x => addend + x; //Super-short way, introduced in D 2.058
}
用 C# 编写:
Func<int, int> MakeAdder(int addend) //Returns a function
{
return delegate(int x) //The long way. Note: Return type is implicitly 'int'
{
return x + addend;
};
return x => x + addend; //Short way: x "goes to" (x + addend); inferred types
}
用C++写法:
#include <functional>
std::function<int(int)> make_adder(int addend)
{
return [=](int x)
{
return addend + x;
};
}
用 Scala 写成:
def makeAdder(addend: Int) = (x: Int) => addend + x
用Python编写:
def make_adder(addend):
def f(x):
return addend + x
return f
# or...
return lambda x: addend + x
用 Erlang 写的:
make_adder(Addend) ->
fun(X) -> Addend + X end.
用 JavaScript 编写:
function makeAdder(addend) {
return function(x) {
return addend + x;
};
}
用 JavaScript 编写(ES2015 箭头函数语法):
const makeAdder = addend => x => addend + x;
写在方案:
(define (makeAdder addend)
(lambda (x)
(+ x addend)))
用Haskell写:
makeAdder :: Int -> (Int -> Int)
makeAdder addend = \x -> addend + x
用 Visual Basic 2008 编写:
Function MakeAdder(addend As Integer) As Func(Of Integer, Integer)
Return Function(x) (x + addend)
End Function
用 Swift 编写(包括详细和速记实现):
func makeAdder(append: Int) -> (x: Int) -> Int {
return { (x: Int) -> Int in
return x + append
};
}
func makeAdder(append: Int) -> (Int) -> Int {
return {$0 + append};
}
(顺便说一句,“lambda”只是一个没有名称的函数。Lambda 仅在支持一等函数的语言中受支持。
让我们考虑函数式编程范式的例子,其中函数是一等公民。当我们说函数是一等公民时,我们可以用函数做以下事情......
- 函数可以分配给变量
- 函数可以存储在数据结构中
- 函数可以作为参数传递给其他函数
- 函数可以从函数返回
在函数式编程语言中,可以执行上述操作。
现在,让我们尝试回答这个问题,Java是否支持一等公民函数(或不支持)。
在java中,方法等同于函数。使用方法无法执行上述任何操作。但是上述所有功能都可以通过java对象实现。因此,对象是java中的第一等公民。诚然,java8 支持使用函数接口和 lambda 表达式将方法(确切地说是方法行为)传递给其他方法。但这并不意味着java具有作为一等公民的功能。
执行上述操作(例如传递函数,从函数返回函数)的能力非常强大且有用。这是因为,它允许我们传递行为而不仅仅是数据。
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-