什么是头等公民职能?

Alp*_*ine 43 java uses first-class-functions

什么是头等公民职能?

Java是否支持一流的公民功能?

编辑:
正如在Wikepedia上提到的那样

一级函数是函数式编程风格的必需品.

有没有其他使用头等功能?

Meh*_*dad 49

将过程视为"一等"的语言允许函数像任何其他值一样传递.

Java 7(及更早版本)和C"种类"等语言具有以下功能:C允许传递函数指针,但您无法动态定义这些语言中的函数并突然将其传递到其他位置.版本8之前的Java可以在一定程度上使用匿名类来模拟它,但它在技术上并不具有一流的功能.

在另一方面,C++,d,C#,Visual Basic .NET中,爪哇8+和函数式语言(如计划和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
}
Run Code Online (Sandbox Code Playgroud)

用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
}
Run Code Online (Sandbox Code Playgroud)

用C++编写:

#include <functional>

std::function<int(int)> make_adder(int addend)
{
    return [=](int x)
    {
        return addend + x;
    };
}
Run Code Online (Sandbox Code Playgroud)

用Scala写的:

def makeAdder(addend: Int) = (x: Int) => addend + x
Run Code Online (Sandbox Code Playgroud)

用Python编写:

def make_adder(addend):
    def f(x):
        return addend + x
    return f
    # or...
    return lambda x: addend + x
Run Code Online (Sandbox Code Playgroud)

写在Erlang:

make_adder(Addend) ->
    fun(X) -> Addend + X end.
Run Code Online (Sandbox Code Playgroud)

用JavaScript编写:

function makeAdder(addend) {
    return function(x) {
        return addend + x;
    };
}
Run Code Online (Sandbox Code Playgroud)

用JavaScript编写(ES2015箭头函数语法):

const makeAdder = addend => x => addend + x;
Run Code Online (Sandbox Code Playgroud)

写在计划中:

(define (makeAdder addend)
  (lambda (x)
    (+ x addend)))
Run Code Online (Sandbox Code Playgroud)

写在Haskell:

makeAdder :: Int -> (Int -> Int)
makeAdder addend = \x -> addend + x
Run Code Online (Sandbox Code Playgroud)

用Visual Basic 2008编写:

Function MakeAdder(addend As Integer) As Func(Of Integer, Integer)
    Return Function(x) (x + addend)
End Function
Run Code Online (Sandbox Code Playgroud)

用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};
}
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,"lambda"只是一个没有名字的函数.只有支持一流函数的语言才支持Lambda.)


Ted*_*opp 1

维基百科的定义非常好——它是一个可以像任何其他数据一样传递的函数。Java 不支持它们。最接近的是RunnableCallable对象。