Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Lambda e Interfacce

  1. #1

    Lambda e Interfacce

    Buonasera, all’università (di informatica a Firenze) hanno trattato le interfacce e le lambda.

    Mi spieghereste l’utilizzo, nella pratica, di queste?
    Con le interfacce l’utilizzo di implement ha qualcosa di simile con extend, per una classe?

    Sono confuso sull’utilizzo pratico di questi due argomenti.

    Grazie per l’attenzione e vi pregherei di non dare risposte scortesi.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da SteveJobs Visualizza il messaggio
    Buonasera, all’università (di informatica a Firenze) hanno trattato le interfacce e le lambda.

    Mi spieghereste l’utilizzo, nella pratica, di queste?
    Una espressione lambda è una rappresentazione "concisa" e compatta di una funzione che:
    - non ha un nome (è "anonima", insomma)
    - ha una lista di parametri (possibilmente anche nessun parametro)
    - ha un corpo (o in forma breve una singola espressione)
    - ha un valore di ritorno

    Java non è un linguaggio "funzionale". Non ha un tipo di dato specifico per le funzioni (come invece vale per altri linguaggi). Per "modellare" le espressioni lambda, in Java 8 hanno tirato fuori il concetto di functional interface. Una functional interface è semplicemente una normale interfaccia ma con una caratteristica importante: ha UN SOLO metodo abstract, astratto.

    Runnable, Comparable, Comparator, sono alcune delle interfacce già esistenti da prima di Java 8 che hanno 1 solo metodo astratto. E quindi sono di fatto delle functional interface. In Java 8 ne sono state aggiunte molte altre nel nuovo package java.util.function.

    Una espressione lambda quindi può "vivere" solo se associata ad una functional interface, in modo che l'inferenza dei tipi possa dedurre la "forma" della espressione lambda basandosi sulla forma di quel singolo metodo astratto.

    Per ordinare una lista di stringhe in Java 7 si poteva fare (con una classe "anonima"):

    codice:
    List<String> stringhe = Arrays.asList("ciliegia", "mela", "pera", "banana", "arancia");
    
    Comparator<String> lunghezzaComparator = new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return Integer.compare(s1.length(), s2.length());
        }
    };
    
    Collections.sort(stringhe, lunghezzaComparator);
    System.out.println(stringhe);

    Nota: Integer.compare è stato aggiunto in Java 7. È comodo, altrimenti si dovevano fare i vari test con gli operatori < e > .

    Con Java 8 si può fare:

    codice:
    List<String> stringhe = Arrays.asList("ciliegia", "mela", "pera", "banana", "arancia");
    
                                             // espressione lambda
    Comparator<String> lunghezzaComparator = (s1, s2) -> Integer.compare(s1.length(), s2.length());
    
    Collections.sort(stringhe, lunghezzaComparator);
    System.out.println(stringhe);

    L'espressione lambda è assegnata ad un Comparator<String> (functional interface) e l'inferenza dei tipi deduce che i parametri s1 e s2 sono String perché Comparator è parametrizzato <String>, quindi il int compare(T o1, T o2) di Comparator combacia perché i due argomenti T sono String e il valore di ritorno della lambda è un int.

    NON puoi ad esempio fare:

    Object lunghezzaComparator = (s1, s2) -> Integer.compare(s1.length(), s2.length());

    Object non è una functional interface, quindi non è possibile dedurre nulla sulla forma della espressione lambda.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.