java - 什么是一等公民职能?

标签 java first-class-functions uses

什么是一等公民函数?

Java 是否支持一等公民功能?

编辑:
正如 Wikepedia 中提到的那样

First class functions are a necessity for the functional programming style.

头等函数还有其他用途吗?

最佳答案

一种将过程视为“一流”的语言允许像任何其他值一样传递函数

像 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 - 什么是一等公民职能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178068/

相关文章:

r - Homebrew: `brew uses --installed gcc` 没有给出任何结果

MySQL 进程使用超过 100% 的 CPU 使用率,需要大约 1 GB 的内存

swift - 使用重载函数作为一等公民

python - 'TreeDict'(或 TreeMap )在实践中有什么用?

java - 如何使用Gson提取字段

java - 如何在 SOAPFault 中设置 faultCode?

python - 使用类函数数组初始化类变量

Java 8 围绕功能作为一等公民跳舞?

java - 并发和日历类

Java : Semaphore: Producer Consumer: Threads and ThreadGroup