propiedades icon funciones example java first-class-functions uses

java - icon - jbutton propiedades



¿Qué es una función ciudadana de primera clase? (6)

¿Qué es una función ciudadana de primera clase?

¿Java es compatible con la función de ciudadano de primera clase?

Editar:
Como mención en Wikepedia

Las funciones de primera clase son una necesidad para el estilo de programación funcional.

¿Hay algún otro uso de funciones de primera clase?


Consideremos el ejemplo del paradigma de programación funcional en el que las funciones son los ciudadanos de primera clase. Cuando decimos que las funciones son los ciudadanos de primera clase, podemos hacer lo siguiente con la función ...

  • La función se puede asignar a una variable
  • La función se puede almacenar en una estructura de datos
  • La función se puede pasar como un argumento para otras funciones
  • La función puede ser devuelta desde las funciones

En lenguajes de programación funcionales, es posible hacer lo mencionado anteriormente.

Ahora, intentemos responder la pregunta, si java es compatible con las funciones de ciudadano de primera clase (o no).

En Java, los métodos son equivalentes a las funciones. No es posible hacer ninguna de las anteriores con métodos. Pero todo lo anterior es posible con objetos Java. Entonces, los objetos son los ciudadanos de primera clase en Java. Es cierto que java8 admite el paso de métodos (comportamiento del método, para ser precisos) a otros métodos que utilizan interfaces funcionales y expresiones lambda. Pero eso no significa que Java tenga funciones como ciudadanos de primera clase.

La capacidad de hacer cosas anteriores, como pasar funciones, devolver funciones desde funciones es muy poderosa y útil. Esto se debe a que nos permite pasar el comportamiento, no solo los datos.


La Wikepedia es bastante buena, es una función que puede transmitirse como cualquier otra información. Java no los admite. Lo más cerca que tiene es Runnable y objetos Callable .


Las funciones son ciudadanas de primera clase significa que puede pasar la función a cualquier parte como si fuera una variable.

De Scala

def isOdd(in: Int) = in % 2 == 1 val n = (1 to 10).toList n.filter(isOdd) see here: isOdd is a function. passed as if it''s a variale.

Objects son ciudadanos de primera clase en Java. Un ciudadano de primera clase es el que se puede pasar a cualquier parte. El paralelo es de un ciudadano de primera clase del país se permiten en casi todas partes.

Leer:


No, no puede asignar un método a una variable o pasarlo como argumento a otro método, por ejemplo.

En su lugar, puede usar interfaces para ajustar el comportamiento deseado o la reflexión para reificar los métodos.


Se puede pasar una función de primera clase. Un ejemplo típico es la función de mapa. Aquí hay un ejemplo en Scala que cuadra los elementos de una lista:

val square = (x:Int) => x*x val squaredList = List(1,2,3,4).map(square _) //--> List(1,4,9,16)

La función cuadrada es aquí un argumento para el método del mapa, que lo aplica a cada elemento. Si quieres hacer algo como esto en Java, debes usar un método envuelto en una clase, algo como esto:

interface F<A,B>{ B apply(A a); } static <A,B> List<B> map(List<A> list, F<A,B> f) { List<B> result = new ArrayList<B>(); for(A a:list) result.add(f.apply(a)); return result; } //we have to "wrap" the squaring operation in a class in order to make it a function F<Integer,Integer> square = new F<Integer,Integer>(){ Integer apply(Integer a) { return a*a; } } List<Integer> ints = Arrays.<Integer>asList(1,2,3,4); List<Integer> squares = map(ints, square);

Al observar esto, puede ver que puede realizar la misma tarea de alguna manera en Java, pero con más sobrecarga y sin soporte "nativo" por parte del idioma, pero utilizando una solución temporal (clases contenedoras). Por lo tanto, Java no admite funciones de primera clase, pero puede "simularlas".

Con suerte, Java 8 admitirá funciones de primera clase. Si quieres tener algo de apoyo para esto ahora , mira http://functionaljava.org/ o http://functionalj.sourceforge.net/ , o echa un vistazo al lenguaje Scala.


Un lenguaje que considera que los procedimientos son de "primera clase" permite que las funciones se transmitan como cualquier otro valor .

Los lenguajes como Java 7 (y anteriores) y C "tipo de" tienen esta capacidad: C permite pasar los punteros a las funciones, pero no se puede definir dinámicamente una función en esos idiomas y pasarla de repente a otro lugar. Java anterior a la versión 8 puede simular esto hasta cierto punto con clases anónimas, pero técnicamente no tiene funciones de primera clase.

Por otro lado, C ++, D, C #, Visual Basic .NET, Java 8+ y lenguajes funcionales (como Scheme y Haskell) le permiten pasar funciones como variables. Por ejemplo, el siguiente código devuelve una función que agrega un sumando a su entrada:

Escrito en 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 }

Escrito en 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 }

Escrito en C ++:

#include <functional> std::function<int(int)> make_adder(int addend) { return [=](int x) { return addend + x; }; }

Escrito en Scala:

def makeAdder(addend: Int) = (x: Int) => addend + x

Escrito en Python:

def make_adder(addend): def f(x): return addend + x return f # or... return lambda x: addend + x

Escrito en Erlang:

make_adder(Addend) -> fun(X) -> Addend + X end.

Escrito en JavaScript:

function makeAdder(addend) { return function(x) { return addend + x; }; }

Escrito en JavaScript (sintaxis de la función flecha ES2015):

const makeAdder = addend => x => addend + x;

Escrito en Scheme:

(define (makeAdder addend) (lambda (x) (+ x addend)))

Escrito en Haskell:

makeAdder :: Int -> (Int -> Int) makeAdder addend = /x -> addend + x

Escrito en Visual Basic 2008:

Function MakeAdder(addend As Integer) As Func(Of Integer, Integer) Return Function(x) (x + addend) End Function

Escrito en Swift (implementaciones detalladas y abreviadas):

func makeAdder(append: Int) -> (x: Int) -> Int { return { (x: Int) -> Int in return x + append }; } func makeAdder(append: Int) -> (Int) -> Int { return {$0 + append}; }

(Por cierto, una "lambda" es solo una función sin nombre. Las lambdas solo se admiten en idiomas que admiten funciones de primera clase).