2009-05-30 15 views
22

Qualcuno può dirmi se esiste un equivalente per le funzioni lambda di Python in Java?Equivalente per le funzioni lambda di Python in Java?

+0

Per quello che vale, cinque anni dopo, Java 8 ha aggiunto espressioni lambda come funzionalità di lingua e una nuova API di Streams per gestire le operazioni di dati di massa. Non abbastanza comprensibili, ma comunque utili. –

+0

Controlla questo: [Sono Java 8 Lambdas Closures?] (Http://bruceeckel.github.io/2015/10/17/are-java-8-lambdas-closures/) –

risposta

9

Non penso che esista un equivalente esatto, tuttavia ci sono classi anonime che sono il più vicino possibile. Ma ancora piuttosto diverso. Joel Spolsky ha scritto un articolo su come gli studenti hanno insegnato solo a Java che stanno perdendo queste bellezze della programmazione in stile funzionale: Can Your Programming Language Do This?.

28

Sfortunatamente, non ci sono lambda in Java. Tuttavia, è possibile ottenere quasi lo stesso effetto (in un modo davvero brutto) con le classi anonime:

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!"); 
      } 
     }); 
    } 
} 

Ovviamente questi avrebbe dovuto essere in file separati :(

+1

Lambda può prendere e restituirà un valore . Vuoi qualcosa di più come Callable. – Dustin

+1

Oltre ad essere in grado di accettare parametri e valori di ritorno, lambda può anche accedere alle variabili locali nell'ambito che sono state definite.In Java, le classi anonime possono accedere alle variabili finali nell'ambito in cui sono state definite, il che è abbastanza simile. OTOH, potrebbe essere una buona idea per Qualcosa per implementare Callable. – gooli

+0

Un piccolo cavillo: 'MyLambda' non deve essere in un file diverso; potresti dichiararlo come un'interfaccia interna, pubblica, statica di 'Something'. –

1

Un po 'in modo simile a Zifre di, è potrebbe creare un'interfaccia così

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

per consentire di scrivere, dire

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(); 
} 

È ancora un po 'sfasato, sì, ma ha input/output almeno.

+0

Penso che manchi una parentesi sulla linea 5 di quel secondo snippet di codice. Ho provato ad aggiungerlo da solo, ma StackOverflow non mi consente di apportare modifiche di solo 1 carattere in lunghezza. – falsePockets

0

Con il rilascio di Java 8 , lambdacia- l'espressione è n disponibile E la funzione lambda in java è in realtà "più potente" di quella di python.

In Python, lambda-expression può avere una sola espressione per il suo corpo e nessuna istruzione return è consentita. In Java, puoi fare qualcosa di simile a questo: (int a, int b) -> { return a * b; }; e altre cose facoltative.

Java 8 introduce anche un'altra interfaccia denominata Function Interface. Potresti voler controllare anche questo.

Problemi correlati