SlideShare a Scribd company logo
1 of 11
Download to read offline
Object orienteed
Programming
Espressioni Lambda
A cura di Roberto Musa
Gruppo Musa ICT - Creazione Siti Internet e Marketing
Cosa sono le Espressioni Lamba
Le espressioni Lambda sono di fatto delle funzioni anonime dove si indica
direttamente, senza assegnare un nome, parametri restituiti e codice della
funzione.
La struttura base di una espressione lambda è il seguente:
([tipoA a, tipoB b,… ])->{Codice…}
Tutto ciò che può essere dedotto dal contesto è abbreviabile come parametri
restituiti, tipi e parentisi.
Nel caso si scriva una sola riga di codice, petanto con le grafe omesse, per
restituire un valore va omesso il «return».
Esempio di espressione lambda ridotta al minimo:
e -> e.getEl(); //nessuna parentisi tonda perché restituisce un solo
paramentro e nessun tipo in quanto deducibile dal contesto, inoltre sono omesse
grafe e return in quanto il codice è costituito da una sola istruzione
Perché le Espressioni Lamba
Java nasce come paradigma ad oggetti e mai in passato ha voluto discostarsi da
questa sua caratteristica che lo rendeva ottimo in certe applicazioni ma lo
indebolisce con l’esplosione del multicore computing a cui la programmazione
funzionale si adatta meglio.
Nell’ottica di permettere la programmazione funzionale e di sintetizzare al
massimo il codice, Java 8 reinserisce le Espressioni Lambda.
Quando usare le Espressioni Lambda
Le Espressioni Lambda si usano per ridefinire il Metodo Astratto (SAM: Single Abstract
Metod) di un’interfaccia funzionale in base al contesto.
Ad esempio un filtro può dipendere dal contesto o dalla richiesta ed ecco che con le
espressioni lambda possiamo ridefinirlo di volta in volta in base alle nostre necessità.
Esempio Videoteca: (Nell’esempio vediamo un metodo chiamare il SAM dell’IF che
definiremo tramite Espressione Lambda nel al momento di utilizzarla nel main)
…
Videoteca videoteca = new Videoteca();
//Filtro per Valutazione:
Film[] beiFilm = videoteca. getFilmFiltrati (film->
film.getMediaRecensioni() > 3);
//Filtro per genere:
Film[] fantasy = videoteca. getFilmFiltrati (film->
‘’Fantasy’’.equals(film.getGenere()));
@FunctionalInterface
public Interface FiltroFilm {
boolean filtra (Film film);
}
public Class Videoteca {
public Film[] getFilmFiltrati (FiltroFilm
filtroFilm) {
…
if (filtroFilm.filtra(film))
filmFiltrati[i++]=film;
…
}
}
Esercizio
 Creare un sistema Videoteca contenente un elenco di Film di cui son noti
Codice, Titolo, Autore, Genere, Durata e Media Recensioni.
 Il sistema deve poter restituire:
 L’elenco dei Film per autore;
 L’elenco dei film per genere;
 L’elenco dei film con media voto superiore alla soglia indicata;
 L’elenco dei film per durata.
Assumere di essere in possesso di un database di film in un file csv in cui ogni
film è in una riga ed i campi sono separati da virgola.
Soluzione: La classe Films
package Videoteca;
public class Films {
private int codice;
private String titolo;
private String autore;
private String genere;
private int durata;
private double mediaRecensioni;
public Films(int codice, String
titolo, String autore, String genere, int
durata, double mediaRecensioni){
this.codice = codice;
this.titolo = titolo;
this.autore = autore;
this.genere = genere;
this.durata = durata;
this.mediaRecensioni =
mediaRecensioni;
}
public void setCodice(int codice){
this.codice = codice;
}
public void setTitolo(String titolo){
this.titolo = titolo;
}
public void setAutore(String autore){
this.autore = autore;
}
public void setGenere(String
genere){
this.genere = genere;
}
public void setDurata(int durata){
this.durata = durata;
}
public void
setMediaRecensioni(double
mediaRecensioni){
this.mediaRecensioni =
mediaRecensioni;
}
public int getCodice(){
return this.codice;
}
public String getTitolo(){
return this.titolo;
}
public String getAutore(){
return this.autore;
}
public String getGenere(){
return this.genere;
}
public int getDurata(){
return this.durata;
}
public double getMediaRecensioni(){
return this.mediaRecensioni;
}
}
Soluzione: L’Interfaccia Funzionale
FiltroFilm
package Videoteca;
@FunctionalInterface
public interface FiltroFilm {
boolean filtra(Films film);
}
Soluzione: La classe Videoteca
package Videoteca;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class Videoteca {
private HashMap<Integer, Films> films;
public Videoteca(Films[] listaFilm){
this.films = new HashMap<Integer, Films>();
for (Films film : listaFilm) {
this.films.put(film.getCodice(), film);
}
}
public Videoteca(List<Films> listaFilm){
this.films = new HashMap<Integer, Films>();
for (Films film : listaFilm) {
this.films.put(film.getCodice(), film);
}
}
@SuppressWarnings("unchecked")
public Videoteca(File listaFilm){
//letturaFile e creazione mappa di Films
//List<String> readAllLines(Path path)
ArrayList<Films> filmList = new ArrayList<Films>();
try {
String SEPARATOR = ",";
BufferedReader listaReader = new
BufferedReader(new FileReader(listaFilm));
filmList = (ArrayList<Films>)
listaReader.lines().map(line -> Arrays.asList(line.split(SEPARATOR)));
listaReader.close();
for (Films film : filmList) {
this.films.put(film.getCodice(), film);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Soluzione: La classe Videoteca
public List<Films> cerca(FiltroFilm filtroFilm){
ArrayList<Films> filmList = new ArrayList<Films>(this.films.values());
ArrayList<Films> filmFiltrati = new ArrayList<Films>();
for (Films film : filmList) {
if (filtroFilm.filtra(film))
filmFiltrati.add(film);
}
return filmFiltrati;
}
}
Soluzione: Il main
package Videoteca;
import java.io.File;
import java.util.List;
import java.util.Scanner;
public class Mediateca {
public static void main(String[] args) {
File listafilm = new File(args[0]);
// TODO Auto-generated method stub
Videoteca videoteca = new Videoteca(listafilm);
//Film per autore;
String autore;
Scanner a = new Scanner(System.in);
autore = a.nextLine();
a.close();
List<Films> filmAutore = videoteca.cerca(film-
>autore.equals(film.getAutore()));
//Film per genere;
String genere;
Scanner g = new Scanner(System.in);
genere = g.nextLine();
g.close();
List<Films> filmGenere = videoteca.cerca(film-
>genere.equals(film.getGenere()));
//Film per media;
int soglia;
Scanner s = new Scanner(System.in);
soglia = Integer.valueOf(s.nextLine());
s.close();
List<Films> beiFilm = videoteca.cerca(film-
>film.getMediaRecensioni() > soglia);
//Film per durata minima;
int durata;
Scanner d = new Scanner(System.in);
durata = Integer.valueOf(d.nextLine());
d.close();
List<Films> filmLunghi = videoteca.cerca(film-
>film.getDurata() > durata);
}
}
Soluzione: Osservazioni
Nella soluzione offerta possiamo osservare come nel metodo «cerca()» della classe
Videoteca venga richiamato il metodo astratto dell’Interfaccia Funzionale FiltroFilm.
Come in ogni Interfaccia il Metodo non è implementato quindi ci è dato sapere cosa ci
verrà restituito (in questo caso un boolean) ma non come questo verrà elaborato.
Le espressioni Lambda che abbiamo usato nel nostro esempio vanno a ridefinire il
metodo di volta in volta, permettendoci di avere risultati differenti senza dover
richiamare o creare nuovi metodi.
Per effetto dell’ereditarietà molte volte l’Interfaccia Funzionale non è esplicitata,
caso evidente con l’uso delle collezioni e degli stream che implementano Interfacce
quali Iterable e Comparable.
Es:
List<String> strings = new ArrayList<>();
strings.stream().forEach((string) -> {
System.out.println("Content: " +
string);
});
Es2:
strings.parallelStream().
filter(s -> s.contains("java")).
forEach((string) -> {
System.out.println("Content: " +
string);
});
}

More Related Content

Similar to OOP Scano di Montiferro - Java 8: Espressioni Lambda

Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewFrancesco Sciuti
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Bruno Interlandi
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of KotlinErik Minarini
 
ZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXTiziano Lattisi
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)DotNetMarche
 
(My) Best Practices in Symfony
(My) Best Practices in Symfony(My) Best Practices in Symfony
(My) Best Practices in Symfonyinmarelibero
 
Functional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaFunctional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaEzio Sperduto, PhD
 
Qt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immaginiQt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immaginiPaolo Sereno
 
Levate l'ancora! Rotte senza problemi con ZF2
Levate l'ancora! Rotte senza problemi con ZF2Levate l'ancora! Rotte senza problemi con ZF2
Levate l'ancora! Rotte senza problemi con ZF2Diego Drigani
 

Similar to OOP Scano di Montiferro - Java 8: Espressioni Lambda (20)

Presentazione java7
Presentazione java7Presentazione java7
Presentazione java7
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Acadevmy - TypeScript Overview
Acadevmy - TypeScript OverviewAcadevmy - TypeScript Overview
Acadevmy - TypeScript Overview
 
TYPO3 CMS 7.3 - le novita
TYPO3 CMS 7.3 - le novitaTYPO3 CMS 7.3 - le novita
TYPO3 CMS 7.3 - le novita
 
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...Configurazione automatica di ambienti di testing per reti di calcolatori - te...
Configurazione automatica di ambienti di testing per reti di calcolatori - te...
 
Two months of Kotlin
Two months of KotlinTwo months of Kotlin
Two months of Kotlin
 
ZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFXZoeFX: un framework MVC per JavaFX
ZoeFX: un framework MVC per JavaFX
 
Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)Deep diving C# 4 (Raffaele Rialdi)
Deep diving C# 4 (Raffaele Rialdi)
 
(My) Best Practices in Symfony
(My) Best Practices in Symfony(My) Best Practices in Symfony
(My) Best Practices in Symfony
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
Logging
LoggingLogging
Logging
 
Functional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni LambdaFunctional Programming in Java - Le Espressioni Lambda
Functional Programming in Java - Le Espressioni Lambda
 
Qt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immaginiQt Lezione3: un visualizzatore di immagini
Qt Lezione3: un visualizzatore di immagini
 
Java OCA teoria 1
Java OCA teoria 1Java OCA teoria 1
Java OCA teoria 1
 
Java Advanced
Java AdvancedJava Advanced
Java Advanced
 
Levate l'ancora! Rotte senza problemi con ZF2
Levate l'ancora! Rotte senza problemi con ZF2Levate l'ancora! Rotte senza problemi con ZF2
Levate l'ancora! Rotte senza problemi con ZF2
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 

Recently uploaded

TeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdfTeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdfteccarellilorenzo
 
Palestini Aurora-Steve Jobs,Olivetti e Gates.pptx
Palestini Aurora-Steve Jobs,Olivetti e Gates.pptxPalestini Aurora-Steve Jobs,Olivetti e Gates.pptx
Palestini Aurora-Steve Jobs,Olivetti e Gates.pptxpalestiniaurora
 
Le forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docxLe forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docxpalestiniaurora
 
Piccole Personetestoitaliano-AuroraPalestini.docx
Piccole Personetestoitaliano-AuroraPalestini.docxPiccole Personetestoitaliano-AuroraPalestini.docx
Piccole Personetestoitaliano-AuroraPalestini.docxpalestiniaurora
 
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024IISGiovanniVallePado
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticanico07fusco
 
Storia-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxStoria-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxteccarellilorenzo
 
Pancia Asia_relazione laboratorio(forza d'attrito).docx
Pancia Asia_relazione laboratorio(forza d'attrito).docxPancia Asia_relazione laboratorio(forza d'attrito).docx
Pancia Asia_relazione laboratorio(forza d'attrito).docxpalestiniaurora
 
Pancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptx
Pancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptxPancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptx
Pancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptxpalestiniaurora
 
presentazione varietà allotropiche del carbonio.pptx
presentazione varietà allotropiche del carbonio.pptxpresentazione varietà allotropiche del carbonio.pptx
presentazione varietà allotropiche del carbonio.pptxmichelacaporale12345
 
Pancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptx
Pancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptxPancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptx
Pancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptxpalestiniaurora
 
Una breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereUna breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereMarco Chizzali
 
magia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptxmagia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptxpalestiniaurora
 
Gli isotopi scienze naturale seconda pres
Gli isotopi scienze naturale seconda presGli isotopi scienze naturale seconda pres
Gli isotopi scienze naturale seconda prespalestiniaurora
 
magia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptxmagia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptxpalestiniaurora
 
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxTeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxteccarellilorenzo
 
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...Nguyen Thanh Tu Collection
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxsasaselvatico
 
TeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxTeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxteccarellilorenzo
 
Le forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docxLe forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docxpalestiniaurora
 

Recently uploaded (20)

TeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdfTeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdf
 
Palestini Aurora-Steve Jobs,Olivetti e Gates.pptx
Palestini Aurora-Steve Jobs,Olivetti e Gates.pptxPalestini Aurora-Steve Jobs,Olivetti e Gates.pptx
Palestini Aurora-Steve Jobs,Olivetti e Gates.pptx
 
Le forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docxLe forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docx
 
Piccole Personetestoitaliano-AuroraPalestini.docx
Piccole Personetestoitaliano-AuroraPalestini.docxPiccole Personetestoitaliano-AuroraPalestini.docx
Piccole Personetestoitaliano-AuroraPalestini.docx
 
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informatica
 
Storia-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxStoria-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptx
 
Pancia Asia_relazione laboratorio(forza d'attrito).docx
Pancia Asia_relazione laboratorio(forza d'attrito).docxPancia Asia_relazione laboratorio(forza d'attrito).docx
Pancia Asia_relazione laboratorio(forza d'attrito).docx
 
Pancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptx
Pancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptxPancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptx
Pancia Asia-La vita di Steve Jobs-Adriano Olivetti-Bill Gates.pptx
 
presentazione varietà allotropiche del carbonio.pptx
presentazione varietà allotropiche del carbonio.pptxpresentazione varietà allotropiche del carbonio.pptx
presentazione varietà allotropiche del carbonio.pptx
 
Pancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptx
Pancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptxPancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptx
Pancia Asia-Pelusi Sara-La pittura romana - Copia (1).pptx
 
Una breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereUna breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opere
 
magia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptxmagia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptx
 
Gli isotopi scienze naturale seconda pres
Gli isotopi scienze naturale seconda presGli isotopi scienze naturale seconda pres
Gli isotopi scienze naturale seconda pres
 
magia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptxmagia, stregoneria, inquisizione e medicina.pptx
magia, stregoneria, inquisizione e medicina.pptx
 
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxTeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
 
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
 
TeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxTeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docx
 
Le forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docxLe forme allotropiche del C-Palestini e Pancia.docx
Le forme allotropiche del C-Palestini e Pancia.docx
 

OOP Scano di Montiferro - Java 8: Espressioni Lambda

  • 1. Object orienteed Programming Espressioni Lambda A cura di Roberto Musa Gruppo Musa ICT - Creazione Siti Internet e Marketing
  • 2. Cosa sono le Espressioni Lamba Le espressioni Lambda sono di fatto delle funzioni anonime dove si indica direttamente, senza assegnare un nome, parametri restituiti e codice della funzione. La struttura base di una espressione lambda è il seguente: ([tipoA a, tipoB b,… ])->{Codice…} Tutto ciò che può essere dedotto dal contesto è abbreviabile come parametri restituiti, tipi e parentisi. Nel caso si scriva una sola riga di codice, petanto con le grafe omesse, per restituire un valore va omesso il «return». Esempio di espressione lambda ridotta al minimo: e -> e.getEl(); //nessuna parentisi tonda perché restituisce un solo paramentro e nessun tipo in quanto deducibile dal contesto, inoltre sono omesse grafe e return in quanto il codice è costituito da una sola istruzione
  • 3. Perché le Espressioni Lamba Java nasce come paradigma ad oggetti e mai in passato ha voluto discostarsi da questa sua caratteristica che lo rendeva ottimo in certe applicazioni ma lo indebolisce con l’esplosione del multicore computing a cui la programmazione funzionale si adatta meglio. Nell’ottica di permettere la programmazione funzionale e di sintetizzare al massimo il codice, Java 8 reinserisce le Espressioni Lambda.
  • 4. Quando usare le Espressioni Lambda Le Espressioni Lambda si usano per ridefinire il Metodo Astratto (SAM: Single Abstract Metod) di un’interfaccia funzionale in base al contesto. Ad esempio un filtro può dipendere dal contesto o dalla richiesta ed ecco che con le espressioni lambda possiamo ridefinirlo di volta in volta in base alle nostre necessità. Esempio Videoteca: (Nell’esempio vediamo un metodo chiamare il SAM dell’IF che definiremo tramite Espressione Lambda nel al momento di utilizzarla nel main) … Videoteca videoteca = new Videoteca(); //Filtro per Valutazione: Film[] beiFilm = videoteca. getFilmFiltrati (film-> film.getMediaRecensioni() > 3); //Filtro per genere: Film[] fantasy = videoteca. getFilmFiltrati (film-> ‘’Fantasy’’.equals(film.getGenere())); @FunctionalInterface public Interface FiltroFilm { boolean filtra (Film film); } public Class Videoteca { public Film[] getFilmFiltrati (FiltroFilm filtroFilm) { … if (filtroFilm.filtra(film)) filmFiltrati[i++]=film; … } }
  • 5. Esercizio  Creare un sistema Videoteca contenente un elenco di Film di cui son noti Codice, Titolo, Autore, Genere, Durata e Media Recensioni.  Il sistema deve poter restituire:  L’elenco dei Film per autore;  L’elenco dei film per genere;  L’elenco dei film con media voto superiore alla soglia indicata;  L’elenco dei film per durata. Assumere di essere in possesso di un database di film in un file csv in cui ogni film è in una riga ed i campi sono separati da virgola.
  • 6. Soluzione: La classe Films package Videoteca; public class Films { private int codice; private String titolo; private String autore; private String genere; private int durata; private double mediaRecensioni; public Films(int codice, String titolo, String autore, String genere, int durata, double mediaRecensioni){ this.codice = codice; this.titolo = titolo; this.autore = autore; this.genere = genere; this.durata = durata; this.mediaRecensioni = mediaRecensioni; } public void setCodice(int codice){ this.codice = codice; } public void setTitolo(String titolo){ this.titolo = titolo; } public void setAutore(String autore){ this.autore = autore; } public void setGenere(String genere){ this.genere = genere; } public void setDurata(int durata){ this.durata = durata; } public void setMediaRecensioni(double mediaRecensioni){ this.mediaRecensioni = mediaRecensioni; } public int getCodice(){ return this.codice; } public String getTitolo(){ return this.titolo; } public String getAutore(){ return this.autore; } public String getGenere(){ return this.genere; } public int getDurata(){ return this.durata; } public double getMediaRecensioni(){ return this.mediaRecensioni; } }
  • 7. Soluzione: L’Interfaccia Funzionale FiltroFilm package Videoteca; @FunctionalInterface public interface FiltroFilm { boolean filtra(Films film); }
  • 8. Soluzione: La classe Videoteca package Videoteca; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class Videoteca { private HashMap<Integer, Films> films; public Videoteca(Films[] listaFilm){ this.films = new HashMap<Integer, Films>(); for (Films film : listaFilm) { this.films.put(film.getCodice(), film); } } public Videoteca(List<Films> listaFilm){ this.films = new HashMap<Integer, Films>(); for (Films film : listaFilm) { this.films.put(film.getCodice(), film); } } @SuppressWarnings("unchecked") public Videoteca(File listaFilm){ //letturaFile e creazione mappa di Films //List<String> readAllLines(Path path) ArrayList<Films> filmList = new ArrayList<Films>(); try { String SEPARATOR = ","; BufferedReader listaReader = new BufferedReader(new FileReader(listaFilm)); filmList = (ArrayList<Films>) listaReader.lines().map(line -> Arrays.asList(line.split(SEPARATOR))); listaReader.close(); for (Films film : filmList) { this.films.put(film.getCodice(), film); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
  • 9. Soluzione: La classe Videoteca public List<Films> cerca(FiltroFilm filtroFilm){ ArrayList<Films> filmList = new ArrayList<Films>(this.films.values()); ArrayList<Films> filmFiltrati = new ArrayList<Films>(); for (Films film : filmList) { if (filtroFilm.filtra(film)) filmFiltrati.add(film); } return filmFiltrati; } }
  • 10. Soluzione: Il main package Videoteca; import java.io.File; import java.util.List; import java.util.Scanner; public class Mediateca { public static void main(String[] args) { File listafilm = new File(args[0]); // TODO Auto-generated method stub Videoteca videoteca = new Videoteca(listafilm); //Film per autore; String autore; Scanner a = new Scanner(System.in); autore = a.nextLine(); a.close(); List<Films> filmAutore = videoteca.cerca(film- >autore.equals(film.getAutore())); //Film per genere; String genere; Scanner g = new Scanner(System.in); genere = g.nextLine(); g.close(); List<Films> filmGenere = videoteca.cerca(film- >genere.equals(film.getGenere())); //Film per media; int soglia; Scanner s = new Scanner(System.in); soglia = Integer.valueOf(s.nextLine()); s.close(); List<Films> beiFilm = videoteca.cerca(film- >film.getMediaRecensioni() > soglia); //Film per durata minima; int durata; Scanner d = new Scanner(System.in); durata = Integer.valueOf(d.nextLine()); d.close(); List<Films> filmLunghi = videoteca.cerca(film- >film.getDurata() > durata); } }
  • 11. Soluzione: Osservazioni Nella soluzione offerta possiamo osservare come nel metodo «cerca()» della classe Videoteca venga richiamato il metodo astratto dell’Interfaccia Funzionale FiltroFilm. Come in ogni Interfaccia il Metodo non è implementato quindi ci è dato sapere cosa ci verrà restituito (in questo caso un boolean) ma non come questo verrà elaborato. Le espressioni Lambda che abbiamo usato nel nostro esempio vanno a ridefinire il metodo di volta in volta, permettendoci di avere risultati differenti senza dover richiamare o creare nuovi metodi. Per effetto dell’ereditarietà molte volte l’Interfaccia Funzionale non è esplicitata, caso evidente con l’uso delle collezioni e degli stream che implementano Interfacce quali Iterable e Comparable. Es: List<String> strings = new ArrayList<>(); strings.stream().forEach((string) -> { System.out.println("Content: " + string); }); Es2: strings.parallelStream(). filter(s -> s.contains("java")). forEach((string) -> { System.out.println("Content: " + string); }); }