Lambda Expressions

di il
4 risposte

Lambda Expressions

Ciao a tutti! Come da titolo ho un dubbio riguardo alle Lambda Expressions introdotte con l'ultima versione di Java ( Java 8 ), vi posto un codice di esempio per poi porvi la mia domanda :
public class RunnableTest {
		public static void main(String[] args) {
			
			System.out.println("=== RunnableTest ===");
		 
		    // Anonymous Runnable
		    Runnable r1 = new Runnable(){
		    	@Override
		    	public void run(){
		    		System.out.println("Hello world old style!");
		    	}
		    };
		 
		    // Lambda Runnable
		    Runnable r2 = () -> System.out.println("Hello world with Lambda!");
		 
		    r1.run();
		    r2.run();   
		}
	}
Dal codice postato si nota l'utilizzo di una lambda expressions per istanziare l'oggetto di tipo "Runnable r2", ciò che non capisco è COME utilizzando una lambda expressions vuota, che non accetta parametri e creata su due piedi "al volo" il compilatore capisca che sto ISTANZIANDO "r2" ??? Cioè cavolo, quella lambda expression non ritorna alcun valore e non ne accetta alcuno nemmeno in ingresso, quindi non riesco a capire il ragionamento che c'è dietro per poter permetter l'istanziamento e allo stesso tempo la definizione di cosa deve avvenire all'interno del metodo "run( )" tutto in quella istruzione! Spero di essere stato chiaro!

4 Risposte

  • Re: Lambda Expressions

    In una lambda il compilatore fa inferenza sui tipi, cerca cioe' da solo di capire il tipo dei parametri, se possibile.
    La tua lambda e' molto semplice: visto che stai dichiarando una Runnable, ovviamente hai solo un metodo (altrimenti non sarebbe una lambda) e detto metodo non ha parametri. Fine dell'inferenza, semplice semplice.

    Un pochino piu' complicato:
    ActionListener listener = evt -> buttonClicked();

    Qual e' il tipo di evt? Se ci pensi, ti accorgerai che non ci sono ambiguita'.

    Ovviamente la puoi usare, per esempio, cosi':
    JButton btn = new JButton ("Click me");
    btn.addActionListener(listener);

    Spero di aver risposto alla tua domanda...
  • Re: Lambda Expressions

    sottovento ha scritto:


    In una lambda il compilatore fa inferenza sui tipi, cerca cioe' da solo di capire il tipo dei parametri, se possibile.
    La tua lambda e' molto semplice: visto che stai dichiarando una Runnable, ovviamente hai solo un metodo (altrimenti non sarebbe una lambda) e detto metodo non ha parametri. Fine dell'inferenza, semplice semplice.

    Un pochino piu' complicato:
    ActionListener listener = evt -> buttonClicked();

    Qual e' il tipo di evt? Se ci pensi, ti accorgerai che non ci sono ambiguita'.

    Ovviamente la puoi usare, per esempio, cosi':
    JButton btn = new JButton ("Click me");
    btn.addActionListener(listener);

    Spero di aver risposto alla tua domanda...
    Questo perche "ActionListener" ha come unico metodo "actionPerformed(ActionEvent e)" e quindi con la sintassi del tuo esempio sto a dire "passo il parametro "evt" all'unico metodo dell'interfaccia "ActionListener" ovvero "actionPerformed(....)" ?!
  • Re: Lambda Expressions

    SsaLaroLana ha scritto:



    Questo perche "ActionListener" ha come unico metodo "actionPerformed(ActionEvent e)" e quindi con la sintassi del tuo esempio sto a dire "passo il parametro "evt" all'unico metodo dell'interfaccia "ActionListener" ovvero "actionPerformed(....)" ?!
    Esatto!
  • Re: Lambda Expressions

    sottovento ha scritto:


    SsaLaroLana ha scritto:



    Questo perche "ActionListener" ha come unico metodo "actionPerformed(ActionEvent e)" e quindi con la sintassi del tuo esempio sto a dire "passo il parametro "evt" all'unico metodo dell'interfaccia "ActionListener" ovvero "actionPerformed(....)" ?!
    Esatto!
    Ottimo! Grazie mille della spiegazione, sei stato chiarissimo!
Devi accedere o registrarti per scrivere nel forum
4 risposte