java: lambda expressionslatemar.science.unitn.it/.../19lambdaqr.pptx.pdf · 2019-05-17 · generics...

25
Java: lambda expressions

Upload: others

Post on 30-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Java: lambda expressions

Page 2: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Classeinternaanonima

•  c.setOnMouseEntered(newEventHandler<MouseEvent>(){•  publicvoidhandle(MouseEventevent){•  System.out.print("Entered");•  c.setFill(Color.RED);•  });

• 

2

Sottinteso:AnonimousClassimplements

Page 3: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Sostituzioneconunalambdaexpression

•  c.setOnMouseEntered(newEventHandler<MouseEvent>(){•  publicvoidhandle(MouseEventevent){•  System.out.print("Entered");•  c.setFill(Color.RED);•  });

•  c.setOnMouseEntered((MouseEventevent)->{•  System.out.print("Entered");•  c.setFill(Color.RED);•  });

3

Page 4: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Inferringthefunctionalinterfaces•  Doestheinterfacehaveonlyoneabstract

(unimplemented)method?

•  Doestheparameters(types)ofthelambdaexpressionmatchtheparameters(types)ofthesinglemethod?

•  Doesthereturntypeofthelambdaexpressionmatchthereturntypeofthesinglemethod?

4

Page 5: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Esempio

•  D:CosasiaspettailmetodosetOnMouseEntered?•  R:UnEventHandler<MouseEvent>•  D:L’InterfacciaEventHandler<MouseEvent>haunsolo

metodo?Qualeeconchefirma?•  R:si,handle(MouseEventevent)•  D:chevalorediritornorestituisceilmetodohandle?•  R:void•  D:Lalambdaespressionècoerenteconleattese?•  R:si.

5

c.setOnMouseEntered((MouseEventevent)->{System.out.print("Entered");c.setFill(Color.RED);});

Page 6: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

SupportodaNetbeans

6

Page 7: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Generics

Page 8: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Castavolontà…public class MazzoBase { protected List carte = new LinkedList(); public Carta pescaCarta() { return (Carta) carte.remove(0); }

8

Strutture dati polimorfe richiedono conversioni di tipo al momento dell’estrazione

Ciò può generare errori di tipo a runtime!

… carte.add(‟C,1”); …

Page 9: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Genericspublic class MazzoBase { protected List<Carta> carte = new LinkedList<Carta>(); public Carta pescaCarta() { return (Carta) carte.remove(0); }

9

… e permettendo di identificare gli errori a compilation time

… carte.add(‟C,1”); …

Consentono di specificare un tipo come parametro …

… evitando la necessità di cast espliciti …

error: no suitable method found for add(String) carte.add("C,1"); method Collection.add(Carta) is not applicable (argument mismatch; String cannot be converted to Carta) method List.add(Carta) is not applicable (argument mismatch; String cannot be converted to Carta)

Page 10: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

GenericsinJava

•  PresentiapartiredaJava5•  Analoghiconcettiinaltrilinguaggi– Es.,templateinC++

•  Consentonoladefinizionedi:–  tipogenerico:unaclasseointerfaccialacuidefinizioneincludeunoopiùtipicomeparametro

– metodogenerico:includeladichiarazionediunoopiùtipiusaticomeparametro

10

Page 11: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Tipigenerici

•  class name<T1, T2, ..., Tn>doveT1…Tnsonoitipiconcuilaclasseèparametrizzata– Analogoperleinterfacce

•  Iltipo«attuale»deveesserespecificatoall’attodelladichiarazioneclass Group<T> { … //definizione Group<Student> gs = … //uso Group<Tourist> gt = … //uso

11

Page 12: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

class Pair<X,Y> { private X first; private Y second; public Pair(X a1, Y a2) { first = a1; second = a2; } public X getFirst() { return first; } public Y getSecond() { return second; } public void setFirst(X arg) {first = arg;} public void setSecond(Y arg) {second = arg;} }

Esempio

12Pair<String,Long> = new Pair<String,Long>("PI", 3.14L); Pair<String,Long> = new Pair<>("PI", 3.14L);

«argomenti tipo»: rimpiazzano i parametri all’atto della dichiarazione

«diamond operator» (Java 7): gli argomenti possono essere omessi e

inferiti dal compilatore

I «parametri tipo» sono visibili nell’intera definizione

della classe

... dove sono usati come un qualsiasi altro tipo

(a parte alcuni casi particolari)

tipo generico

Page 13: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Esempiopublic static Set union(Set s1, Set s2) { Set result = new HashSet(s1); result.addAll(s2); return result; }

13

Set può contenere un qualsiasi Object: nessuna garanzia sul fatto che i due insiemi

contengano oggetti dello stesso tipo

public static <E> Set<E> union(Set<E> s1, Set<E> s2) {

Set<E> result = new HashSet<>(s1);

result.addAll(s2); return result;

}

dichiarazione dell’argomento tipo, locale al metodo

metodo generico

Page 14: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Collectionsegenerics

•  IlJavaCollectionFrameworkfaampiousodeigenerics:–  tutteleclassi,interfacceemetodicheabbiamovistofinorasonoinrealtàgenerici

14

Collection<E>, Set<E> List<E> Map<K,V> Comparable<T> Comparator<T>

add(E e)add(int index, E e) put(K key, V value) int compareTo(T o) int compare(T o1, T o2)

Usate sempre le versioni generiche!

Page 15: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Genericsesottotipi•  DatiduetipigenericiG<A>eG<B>doveBèunasottoclassediA,nonèverocheG<B>èunasottoclassediG<A>

•  Inaltreparole:fratalitipigenericinonvaleilprincipiodisostituzione

•  Esempio:Person s = new Student(); //ok Group<Person> g = new Group<Student>(); //no!

•  G<A>eG<B>sonosottoclassidiObject –  In realtà sono la stessa sottoclasse G

15

Page 16: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

…perché?•  IgenericsinJavasonoimplementatimediantetypeerasure– L’informazionesuiparametritipovieneeliminatadopoicontrollistatici

– Vengonoinseritigliopportunicastpermantenereivincolisultipo

•  QuestasceltamantienecompatibilitàconAPIchenonusanogenerics…– Es.JavaCollectionframeworkpre-Java5

•  …mageneraunaseriedilimitazioni

16

Page 17: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Esempio

17

public class Pair { private Object first; private Object second; public Pair(Object a1, Object a2) { first = a1; second = a2; } public Object getFirst() { return first; } public Object getSecond() { return second; } public void setFirst(Object arg) { first = arg; } public void setSecond(Object arg) { second = arg; } } final class Test { public static void main(String[] args) { Pair pair = new Pair("PI", 3.14L); String s = (String) pair.getFirst(); Long l = (Long) pair.getSecond(); Object o = pair.getSecond(); } }

class Pair<X,Y> { private X first; private Y second; public Pair(X a1, Y a2) { first = a1; second = a2; } public X getFirst() { return first; } public Y getSecond() { return second; } public void setFirst(X arg) {first = arg;} public void setSecond(Y arg) {second = arg;} } class Test { public static void main(String[] args) { Pair<String,Long> pair = new Pair<>("PI", 3.14L); String s = pair.getFirst(); Long l = pair.getSecond(); Object o = pair.getSecond(); } }

Page 18: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Genericsesottotipi:wildcard

•  Èpossibilespecificareunaopiùwildcard– RappresentanountipononnotoGroup<?> g = new Group<Student>();– NonpossonoessereusatepercreareoggettiGroup<?> g = new Group<?>(); // no!

•  Utileadesempioperrealizzaremetodigenerici…18

Page 19: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Esempiostatic void printList(List<Object> list) { for (Object elem : list) System.out.println(elem + " "); }

19

L’intento è quello di stampare una lista contenente qualsiasi tipo di

oggetto

List<Person> lp = new LinkedList<>(); … // popolo la lista

printList(lp);

In realtà consente di stampare solo liste di Object

// errore in compilazione!

static void printList(List<?> list) { …

La wildcard risolve il problema consentendo subtyping

Page 20: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Genericsesottotipi:boundedwildcards

•  Èpossibile«limitare»lewildcardspecificandochesonoaccettatisolosottotipidiuntipodatoGroup<? extends Persona> g = new Group<Student>();

•  SiusaextendsancheconleinterfacceGroup<? extends Comparable> g = new Group<Student>();

•  Èpossibilespecificarepiùdiuntipo:sec’èunaclassedeveesserelaprimaGroup<? extends Persona & Comparable> g = new Group<Student>();

20

Page 21: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

•  LewildcardsonousatenelCollectionFramework!es.addAll(Collection<? extends E> c)

Esempiostatic double aggregate(List<? extends Number> list){ double s = 0.0; for (Number n : list) s += n.doubleValue(); return s; }

21Somma il contenuto di una lista i cui elementi

sono vincolati a essere numeri

List<Integer> li = Arrays.asList(1, 2, 3); System.out.println(aggregate(li)); // 6.0

List<Double> ld = Arrays.asList(1.2, 2.3, 3.5); System.out.println(aggregate(ld)); // 7.0

List<String> ls = Arrays.asList("1","2","3"); System.out.println(aggregate(ls)); //compilation error

Può invocare metodi di Number!

Page 22: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Genericsesottotipi:boundedwildcards

•  Èpossibile«limitare»lewildcardancheversolesuperclassiGroup<? super Studente> g = new Group<Persona>();

•  Leregoleditipodiventanocomplicate…

22

Page 23: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Genericsearray•  Nonsipuòcreareunarraygenerico:– Es.:tuttequesteespressionisonoillegali:new List<E>[]new List<String>[]new E[]

•  Motivo:nonsarebbetypesafe– minerebbeilvantaggioprincipaledeigenerics

•  Senecessario,èpossibileusareuncast– Manonèdesiderabile,perlostessomotivo

•  Ingenerale,megliousareList – Piùflessibiliegeneriche

23

Page 24: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Esempio

24

public class Chooser { private final Object[] choiceArray; public Chooser(Collection choices) { choiceArray = choices.toArray(); } public Object choose() { return choiceArray[new Random().nextInt(choiceArray.length)]; } }

public class Chooser<T> { private final List<T> choiceList; public Chooser(Collection<T> choices) { choiceList = new ArrayList<>(choices); } public T choose() { return choiceList.get(new Random().nextInt(choiceList.size())); } }

Collection<T>

T[]

(T[])

T

Chooser.java:4: warning: [unchecked] unchecked cast choiceArray = (T[]) choices.toArray();

Page 25: Java: lambda expressionslatemar.science.unitn.it/.../19LambdaQR.pptx.pdf · 2019-05-17 · Generics in Java • Presenti a partire da Java 5 • Analoghi concetti in altri linguaggi

Alcunelimitazionideigenerics•  Iparametritipononpossonoesseretipiprimitivi

–  Es.ArrayList<int>;maconwrappereautoboxingsolitamentenonèunproblema

•  Genericsnonsipossonousareconinstanceof Object o = new LinkedList<Long>(); obj instanceof List obj instanceof List<?> obj instanceof List<Long> //error obj instanceof List<? extends Number> //error obj instanceof List<? super Number> //error

•  Svariatialtricasiparticolari…•  Perchivuoleapprofondire:http://

www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

25