java: lambda expressionslatemar.science.unitn.it/.../19lambdaqr.pptx.pdf · 2019-05-17 · generics...
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/4.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/5.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/6.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/7.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/8.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/9.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/11.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/15.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/16.jpg)
…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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/17.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/18.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/19.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/20.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/21.jpg)
• 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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/22.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.us/reader034/viewer/2022050403/5f80c5aa9bf25e61d30e532c/html5/thumbnails/25.jpg)
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