Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


LAMBDA EXPRESSION JAVA, Appunti di Elementi di Informatica

Intro sull'utilizzo delle lamba expression in Java

Tipologia: Appunti

2020/2021

Caricato il 17/05/2021

sebavada98
sebavada98 🇮🇹

5

(1)

1 documento

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
LAMBDA EXPRESSION
Vantaggi di usare la lambda:
Include la programmazione funzionale (è un nuovo paradigma, diverso
dall’OOP in certi aspetti)
Codice piu leggibile e coinciso
Semplice nell’utilizzare API e librerie
Consente il supporto per processi paralleli(nei processori multi core)
Functional Programming vs OOP
Functional Programming non ci consente niente di piu di quello che si poteva fare in
precedenza. Quello che ci consente il functional Programming è di scrivere al meglio
codice,molto piu leggibile e piu stabile (da pensare come se fosse un altro
paradigma/tool – che non sostituisce ovviamente il paradigma dell’OOP – è uno
strato in piu all’OOP ed entra in gioco nei giusti contesti )
Le lambda ci consentono di creare entità/actions che sono solo funzioni che non
appartengono alla classe (cio mi differisce dal concetto di OOP). per questo il
nome lambda expression
Le lambda non appartengono alla classe,non sono metodi di una classe; sono solo
funzioni isolate e queste funzioni possono essere trattate come valori.
(io in questo caso posso associare pezzi di codice e non l’esecuzione, ad una
variabile )
L’ associare un blocco di codice ad una variabile si puo fare tramite le lambda
Esempio:
public nelle lambda è superfluo perche ovviamente è utile
in un contesto di ‘classe’ e le lambda a quanto detto, sono
isolate
codeBlock = public void stampa() { superfluo perche per riferisci al blocco di
codice richiamo direttamente la variabile
codeBlock
non è necessario inserire il tipo di ritorno perche il compilatore è piu intelligente di
prima e capisce quando una lambda deve ritornare qualcosa(string o altro) oppure
void analizzando semplicemente il blocco di codice
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica LAMBDA EXPRESSION JAVA e più Appunti in PDF di Elementi di Informatica solo su Docsity!

LAMBDA EXPRESSION

Vantaggi di usare la lambda:  Include la programmazione funzionale (è un nuovo paradigma, diverso dall’OOP in certi aspetti)  Codice piu leggibile e coinciso  Semplice nell’utilizzare API e librerie  Consente il supporto per processi paralleli(nei processori multi core) Functional Programming vs OOP Functional Programming non ci consente niente di piu di quello che si poteva fare in precedenza. Quello che ci consente il functional Programming è di scrivere al meglio codice,molto piu leggibile e piu stabile (da pensare come se fosse un altro paradigma/tool – che non sostituisce ovviamente il paradigma dell’OOP – è uno strato in piu all’OOP ed entra in gioco nei giusti contesti ) Le lambda ci consentono di creare entità/actions che sono solo funzioni che non appartengono alla classe (cio mi differisce dal concetto di OOP). per questo il nome lambda expression Le lambda non appartengono alla classe,non sono metodi di una classe; sono solo funzioni isolate e queste funzioni possono essere trattate come valori. (io in questo caso posso associare pezzi di codice e non l’esecuzione, ad una variabile ) L’ associare un blocco di codice ad una variabile si puo fare tramite le lambda Esempio: public nelle lambda è superfluo perche ovviamente è utile in un contesto di ‘classe’ e le lambda a quanto detto, sono isolate codeBlock = public void stampa() { superfluo perche per riferisci al blocco di codice richiamo direttamente la variabile codeBlock non è necessario inserire il tipo di ritorno perche il compilatore è piu intelligente di prima e capisce quando una lambda deve ritornare qualcosa(string o altro) oppure void analizzando semplicemente il blocco di codice

System.out.println(“ciao”); }  ci sono delle cose extra che a noi non servono L’unica cosa che rimane alla fine della firma del metodo sono le ‘()’ per i parametri in input e {} per definire il blocco di codice(si possono togliere che il codice è in una sola riga). E’ obbligatorio inserire prima delle graffe, una freccia “->” per definire che è una lambda Esempio semplice di lambda senza parametri in input: greetExpression = () -> {System.out.println(“ciao”) Esempio di lambda con parametri in input: greetExpression= (int a) -> a+2;  dato che inline non c’è bisogno delle {} e della keyword return Le lambda contengono dei comportamenti,action e cio ci consente di risparmiare un mucchio di codice perche prima del java 8 per fare una cosa del genere era necessario (questo in modo elegante) creare un’interfaccia contente dei metodi e in base all’impl dell’interfaccia gestire l’actions (vedere esempio su ecplise -workspace -lambda)

Il tipo di una variabile alla quale è associata una lambda è una

functionalInterface, interfaccia che presenta un solo metodo ( in modo

tale che quando dichiaro la mia lambda, il compilatore sa che l’unica

associazione di quella lambda expression è il metodo definito nella

functionalInterface). Ovviamente la lambda expression deve avere la

stessa firma del metodo dichiarato nell’interfaccia.

Per eseguire una lambda expression, basta richiamare il metodo definito

nell’interfaccia funzionale ( lo richiami ovviamente dalla variabile che

contiene la lambda)

La lambda lavora come se fosse una sorta di implementazione

dell’interfaccia presa in considerazione

FUNCTION INTERFACE ‘OUT OF THE BOX’

Java 8 contiene ,all’interno del package functions, delle interfacce

funzionali ‘out-of-the-box’, che consentono/mettono a disposizione dei

‘pattern’/ scenari come ad esempio il caso lo scenario di test(consiste in

un’interfaccia specifica che contiene un metodo booleano ed eventuali

parametri utili per comporre il test) .Utilizzando queste interfacce non è

necessario creare un’interfaccia custom con uno scenario di test ma

posso semplicemente riutilizzare una di queste interfacce funzionali

1. Predicate : interfaccia funzionale che contiene un metodo astratto

‘test’ con un parametro in input. Questo metodo astratto ritorna un

boolean (quindi ovviamente non è necessario utilizzare

un’interfaccia funzionale custom per un test/filtro ma

semplicemente il Predicate)

2. Consumer : interfaccia funzionale che accetta un parametro in input

e non ritorna nessun risultato(void). Il metodo è accept(Object)

3. Supplier: interfaccia funzionale che rappresenta un fornitore di

risultati. Il metodo è get(). Ovviamente non accetta parametri in

input

4. BiConsumer: interfaccia funzionale che accetta due parametri in

input e non ritorna nessun risultato (come consumer ma con due

parametri)

Gestione delle eccezioni dovuta ad un’espressione definita ed eseguita

all’interno di una lambda:

Nulla vieta di inserire un try/catch sulla riga in questione ma la lambda

cosi perde di eleganza. Per questo è buona norma utilizzare una wrapper

lambda(cioe wrappare la lambda principale all’interno di un’altra lambda

in modo da gestire esternamente una possibile eccezione – vedere su

ecplise)

Closures in Espressioni Lambda

Prima del java 8 , per utilizzare una variabile dichiarata all’esterno di una

classe anonima, bisognava definire la variabile final, affinchè desse la

garanzia che quella variabile non venisse modificata piu avanti.

In java 8 invece non c’è piu bisogno di definire la variabile final perche il

compilatore è piu intelligente. Ti consente di lasciare la variabile definita

al di fuori di una lambda non final pero se si accorge che modifichi il

valore all’interno della lambda, ti da errore. Quando è in esecuzione una

lambda il valore della variabile definita al di fuori viene frizzato per tutta

la sua esecuzione(riferito alla lambda)

Quando una classe inner è definita all'interno del corpo di un metodo,

tutte le variabili dichiarate final nello scope di quel metodo sono

accessibili dall'interno della classe inner. Per i valori scalari, una volta

assegnati, il valore della variabile finale non può cambiare. Per i valori

degli oggetti, il riferimento non può cambiare. Questo permette al

compilatore Java di "catturare" il valore della variabile a run-time e di

memorizzarne una copia come campo nella classe inner. Una volta che il

metodo esterno è terminato e il suo stack frame è stato rimosso, la

variabile originale è andata via, ma la copia privata della classe interna

persiste nella memoria della classe stessa. (da tener conto che quando

richiamo un altro metodo carico un altro scope – stack trace). Quando

utilizzi in una lambda una variabile esterna, il compilatore

automaticamente la vede come una variabile final e genera errore sulla

lambda nel caso in cui la variabile final venga ridefinita con un altro

valore.

DIFFERENZA DEL THIS TRA LAMBDA E ANONYMOUS INNER CLASS

Il this all’interno di una lambda è immutabile , cioe fa riferimento al this

definito all’esterno della lambda mentre per una classe anonima invece

viene istanziato una nuova implementazione dell’interfaccia e quindi il

this definito al suo interno fa riferimento all’istanza della classe anonima

con Java 8 è stato definito un nuovo metodo di iterazione interna (interno perche lasci il controllo a qualcos'altro). Noi infatti definiamo solo l'intento di iterare una lista con Java 8, ogni collection presenta un nuovo metodo chiamato .foreach il metodo foreach accetta come parametro una lambda (istanza di Consumer) -- --> per ogni item in collection eseguimi una particolare lambda Uno dei vantaggi del foreach è che non è sequenziale (a differenza del ciclo for e foreach) cioe posso usarlo in multithread e multiprocessi people.forEach(System.out::println);

JAVA STREAM

Streams  una sequenza di elementi che supportano operazioni

sequenziali e parallele

Streams ci consente di creare una linea di montaggio ( pensare alle linee

di montaggio di industrie automobilistiche: se tre operai devono lavorare

su una lista di macchine, è piu efficiente se tutti e 3 lavorano sulla stessa

macchina piuttosto che iterare auto x auto per ogni operaio  linea di

montaggio) e quindi non iterare object x object la nostra

collection(sarebbe poco efficiente), rendendo il tutto più efficiente a

livello di tempistica e pulizia del codice

ALCUNI METODI PIU’ UTILIZZATI NELLO STREAM:

- Filter  ritorna uno Stream filtrato per un predicate definito ( predicate

ritorna true o false in base alla condizione specificata)

- forEach  ritorna un void e mi itera ogni elemento dello stream in

questione

LAMBDA EXPRESSION ABILITA PROCESSI PARALLELI ( MULTIPLE CORE)

Cio avviene mediante l’utilizzo del metodo parallelStream, utilizzabile e

richiamabile da una collection.

ParallelStream  consente di utilizzare piu core in modo tale da rendere

piu veloci le operazioni all’interno di uno stream. Esso potenzialmente

può splittare la collection in piu stream e rendere il tutto parallelo ( piu

stream viaggiano in parallelo)  il risultato sarà lo stesso di quello

ottenuto con uno stream