2009-05-30 10 views
22

¿Puede alguien decirme si hay un equivalente para las funciones lambda de Python en Java?¿Equivalente para las funciones lambda de Python en Java?

+0

Por lo que vale, cinco años después, Java 8 ha agregado expresiones lambda como una característica de idioma y una nueva API de Streams para manejar operaciones de datos masivos. No es del todo comprensivo, pero sigue siendo útil. –

+0

Mira esto: [¿Son Java 8 Lambdas Closures?] (Http://bruceeckel.github.io/2015/10/17/are-java-8-lambdas-closures/) –

Respuesta

9

No creo que haya un equivalente exacto, sin embargo, hay clases anónimas que están lo más cerca posible. Pero aún es bastante diferente. Joel Spolsky escribió un artículo sobre cómo los estudiantes enseñaron que solo Java se está perdiendo de estas bellezas de la programación de estilo funcional: Can Your Programming Language Do This?.

28

Desafortunadamente, no hay lambdas en Java. Sin embargo, puede obtener casi el mismo efecto (de una manera muy fea) con las clases anónimas:

interface MyLambda { 
    void theFunc(); // here we define the interface for the function 
} 

public class Something { 
    static void execute(MyLambda l) { 
     l.theFunc(); // this class just wants to use the lambda for something 
    } 
} 

public class Test { 
    static void main(String[] args) { 
     Something.execute(new MyLambda() { // here we create an anonymous class 
      void theFunc() {    // implementing MyLambda 
       System.out.println("Hello world!"); 
      } 
     }); 
    } 
} 

Obviamente, estas tendrían que ser en archivos separados :(

+1

Lambda puede tomar y devolverá un valor . Quieres algo más parecido a Callable. – Dustin

+1

Además de poder aceptar parámetros y valores devueltos, las lambdas también pueden acceder a variables locales en el ámbito que se definieron.En Java, las clases anónimas pueden acceder a variables finales en el ámbito en el que se definieron, lo cual es lo suficientemente similar. OTOH, podría ser una buena idea que algo implemente Callable. – gooli

+0

Una pequeña objeción: 'MyLambda' no tiene que estar en un archivo diferente; podría declararlo como una interfaz interna, pública y estática de 'Something'. –

1

un tanto como la Zifre de, usted podría crear una interfaz de este modo

public interface myLambda<In, Out> { 
    Out call(In i); 
} 

para que pueda escribir, dicen

Function<MyObj, Boolean> func = new Function<MyObj, Boolean>() { 
    public Boolean callFor(myObj obj) { 
     return obj.canDoStuff(); 
    }; 

MyObj thing = getThing; 

if (func.callFor(thing)) { 
    doSomeStuff(); 
} else { 
    doOtherStuff(); 
} 

Todavía es un poco kludgy, sí, pero tiene entrada/salida al menos.

+0

Creo que te falta un paréntesis en la línea 5 de ese segundo fragmento de código. Traté de agregarlo yo mismo, pero Stackoverflow no me permite hacer modificaciones de solo 1 carácter de longitud. – falsePockets

0

Con el lanzamiento de Java , lambda- la expresión es n ow disponible. Y la función lambda en java es en realidad "más poderosa" que las de pitón.

En Python, lambda-expression solo puede tener una expresión única para su cuerpo, y no se permite ninguna declaración return. En Java, puede hacer algo como esto: (int a, int b) -> { return a * b; }; y otras cosas opcionales también.

Java 8 también presenta otra interfaz llamada Function Interface. Es posible que desee verificar eso también.

Cuestiones relacionadas