Interfacce funzionali ed espressioni lambda

di il
6 risposte

Interfacce funzionali ed espressioni lambda

Buonasera a tutti...sto studiando sui miei appunti le interfacce funzionali e le espressioni lambda in Java 8, ma ci sono alcune cose che non mi sono chiare.
Innanzitutto non capisco come devo usare le espressioni lambda: nel senso, se io ho una classe che implementa un'interfaccia funzionale, nel momento in cui vado a crearmi l'espressione lambda qualunque essa sia, da quel che ho capito vado ad implementare l'unico metodo dell'interfaccia funzionale...e fin qui ci siamo. Il problema è che se io faccio implementare a Class l'interfaccia Interface, anche se scrivo l'espressione lambda mi viene comunque richiesto di implementare il metodo! Quindi come devo fare? Io avevo capito che le lambda fossero implementazioni al volo evitando quindi dover scrivere @Override e il metodo overridato...ho capito male?
Inoltre se scrivessi più espressioni lambda, non verrebbe overridato il metodo più volte? Non capisco...

Grazie in anticipo e buona serata

6 Risposte

  • Re: Interfacce funzionali ed espressioni lambda

    Shark95 ha scritto:


    nel momento in cui vado a crearmi l'espressione lambda qualunque essa sia, da quel che ho capito vado ad implementare l'unico metodo dell'interfaccia funzionale...
    L'espressione lambda deve infatti "corrispondere" alla forma del metodo astratto della functional interface, in termini di parametri e tipo di ritorno. Il nome del metodo NON conta e non è importante.

    Shark95 ha scritto:


    se io faccio implementare a Class l'interfaccia Interface, anche se scrivo l'espressione lambda mi viene comunque richiesto di implementare il metodo!
    Non è chiaro cosa intendi e hai fatto. La functional interface è alla fin fine ... una interfaccia come tutte le altre (salvo il fatto che ha la particolarità di avere un solo metodo astratto). E quindi è perfettamente lecito implementarla in modo tradizionale in una classe (normale, inner class, ecc...). Ma è ovvio che se la implementi tu con una tua classe ... NON stai facendo (e non puoi fare) una lambda expression.

    Shark95 ha scritto:


    Quindi come devo fare? Io avevo capito che le lambda fossero implementazioni al volo evitando quindi dover scrivere @Override e il metodo overridato...ho capito male?

    Inoltre se scrivessi più espressioni lambda, non verrebbe overridato il metodo più volte? Non capisco...
    Ogni lambda expression È una implementazione della functional interface a cui corrisponde.
  • Re: Interfacce funzionali ed espressioni lambda

    Grazie per la risposta @andbin, quindi se devo usare una lambda, non devo scrivere public class nome_classe implements nome_interfaccia?
    Se non devo scriverlo, allora l'unica cosa che posso fare con quell'interfaccia è usare una lambda?
  • Re: Interfacce funzionali ed espressioni lambda

    Shark95 ha scritto:


    quindi se devo usare una lambda, non devo scrivere public class nome_classe implements nome_interfaccia?
    Ovviamente no ... così diventa una normale classe di cui poi dovrai fare new NomeClasse() ecc...
    Non c'entra niente con le lambda.

    Shark95 ha scritto:


    allora l'unica cosa che posso fare con quell'interfaccia è usare una lambda?
    Una "functional interface" la puoi implementare con una lambda expression O con una normale classe.
  • Re: Interfacce funzionali ed espressioni lambda

    Quindi se ho capito bene, scrivendo una lambda sto praticamente dicendo che quell'oggetto che sto istanziando "implements interface" ovvero esso implementa l'interfaccia? E quindi io invece di fare l'implementazione nella mia classe, posso farla ad esempio nel metodo main della classe giusto? Allora è come se scrivessi dentro il main che un qualcosa implementa la mia interfaccia (sempre usando una lambda expression). Corretto oppure ho toppato?
  • Re: Interfacce funzionali ed espressioni lambda

    Vedi questo sotto:
    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
    
    public class Prova {
        public static void main(String[] args) {
            List<String> stringhe = Arrays.asList("arancia", "mela", "banana");
    
            Predicate<String> predicato1 = str -> str.length() > 4;
    
            Predicate<String> predicato2 = new Predicate<String>() {
                public boolean test(String str) {
                    return str.length() > 4;
                }
            };
    
            List<String> stringhe2 = stringhe.stream()
                    .filter(predicato1)               // puoi passare predicato1 OPPURE predicato2
                    .collect(Collectors.toList());
    
            System.out.println(stringhe);
            System.out.println(stringhe2);
        }
    }
    Qui ci sono DUE implementazioni della interfaccia funzionale Predicate<T> (parametrizzata String).
    La prima implementazione è con una lambda expression.
    La seconda implementazione è con una "anonymous" inner class (ma avrei potuto usare una nested class, una local class o una normalissima classe esterna a Prova .. NON importa).
    Ed entrambe fanno nell'esempio la stessa cosa: "vero" se la stringa ha lunghezza maggiore di 4.

    Quello che importa è che predicato1 e predicato2 fanno riferimento ad oggetti che IMPLEMENTANO la interfaccia Predicate.

    Quindi al filter() dello stream posso passare indifferentemente predicato1 oppure predicato2


    P.S. se hai dubbi sulle 43 interfacce funzionali in java.util.function, puoi vedere il mio "java.util.function Interfaces Cheat Sheet" che trovi qui.
  • Re: Interfacce funzionali ed espressioni lambda

    Ok, quindi avevo capito bene. Grazie mille per il prezioso aiuto! Anche se non conosco ancora stream, collectors e il resto, ho capito ugualmente
Devi accedere o registrarti per scrivere nel forum
6 risposte