2. Java 8 is here!
● Rilasciato il 18-03-2014
● Supportato dagli IDE:
o NetBeans 8.0 (of course)
o Eclipse 4.4 (versione di sviluppo)
o IntelliJ IDEA 13.1
3. Di cosa parliamo
carrellata di feature ci sono le release notes!
trattato sulle lambda expr. magari in un talk dedicato!
selezione (personale!) delle feature più
interessanti e speculazioni sul futuro della
nostra piattaforma.
4. Perché oggi parliamo di Java 8?
...e ieri non abbiamo discusso di Java 7?
Java 8 è, per molti aspetti, il compimento di ciò
che è iniziato con Java 7.
5. Java 7 & 8 in pochi punti
● Ammodernamento del linguaggio
● Aggiornamento delle API
o NIO2
o Date&time
o Streams
● Apertura della JVM a linguaggi non-Java
● Miglioramenti low-level (GC, ecc.)
6. Le lambda expression
Nei linguaggi funzionali sono una notazione per
funzioni anonime.
Closure = funzione (anonima o meno) che
cattura variabili locali.
8. Le lambda expression
La cosa più simile ad una funzione è una
classe (un’istanza) con un solo metodo.
Si parla di SAM: Single Abstract Method (type).
● Runnable, Callable
● Molti EventListener
● ecc. (es. Google Guava)
9. Le lambda expression
Lambda expression =
sintassi concisa per tipi SAM anonimi = (più o meno)
anonymous inner class con un solo metodo
11. Le lambda expression
Callable<Integer> callable = () -> 42;
^^^^^^^^^^^^^^^^^ ^^^^^^^^^
Tipo di destinazione Lambda
(target type) expression
Dev’essere un’interfaccia
con un solo metodo
15. Le lambda expression
Sintassi più pratica = maggiore possibilità di
utilizzo
API che combinano tanti piccoli comportamenti
diventano una possibilità: vediamo l’esempio
16. Streams API
Streams ~= lazy collections
Uno stream esprime un’iterazione
sequenziale o parallela
con possibili trasformazioni (map), filtri,
estrazioni, accumulazioni (reduce) ecc.
17. Streams API
List<String> names = new ArrayList<>();
for(Student student : students){
if(student.getName().startsWith("A")){
names.add(student.getName());
}
}
18. Streams API
List<Student> students = ...;
List<String> names =
students.stream()
.filter(s ->
s.getName().startsWith("A"))
.map(Student::getName)
.collect(Collectors.toList());
19. Streams API
List<Student> students = ...;
List<String> names =
students.stream()
.parallel()
.filter(s ->
s.getName().startsWith("A"))
.map(Student::getName)
.collect(Collectors.toList());
20. Default methods
List<Student> students = ...;
students.stream() ???
stream() è un nuovo metodo nell’interfaccia
Collection. Dunque implementazioni esistenti di
Collection, oppure proxy dinamici… non sono
più compatibili con Java 8?
21. Default methods
stream() è un default method - un metodo in
un’interfaccia che ha un’implementazione di
default.
In questo modo è possibile evolvere le
interfacce senza rompere le implementazioni.
22. Default methods
Per introdurre lambda e Stream API, è stata
aggiunta una feature al linguaggio in modo non
ortogonale.
Vedi C#, LINQ e gli extension method.
24. Nashorn
Mentre tutti erano impegnati a discutere di
lambda expression, Oracle ha rimpiazzato
l’interprete JS Mozilla Rhino (incluso da Java 6)
con una nuova implementazione, Nashorn
(Rinoceronte in tedesco), interamente scritta in
Java, dotata di JIT basato su tecniche moderne
di ottimizzazione di JavaScript (V8).
25. Nashorn
● Usa invokedynamic (Java 7)
● Si invoca tramite JSR-223 (Java 6)
● Oppure da command line!
● Ben integrato con Java
o invocazione di API Java
o implementazione di interfacce Java in JS
o estensione di classi Java in JS
26. Nashorn
var stack = new java.util.LinkedList();
[1, 2, 3, 4].forEach(function(item) {
stack.push(item);
});
var sorted =
stack.stream().sorted().toArray();
27. Avatar.js
Progetto Oracle basato su Nashorn per portare
node.js sulla JVM
● node: event-based, async, single-threaded
● Java/JEE: thread-based, (mostly) sync
28. Altri miglioramenti degni di nota
● G1 (Garbage-First) GC - da Java 7u4
● NIO.2 da Java 7
● Date&time API (Joda time)
● Niente più PermGen!
o Metaspace da memoria non-heap (nativa)
o Possibilità di capping
o Non elimina i problemi di classloader leak!
30. Considerazioni (personali!)
● Lambda - buona astrazione, ma non era una
mancanza fondamentale
● Streams - buona astrazione, ma forse Java
non è il linguaggio più adatto
● Streams - parallel() di dubbia utilità
● Default methods - wart!
31. Considerazioni (personali!)
● Apertura a nuovi linguaggi
o Java linguaggio “low-level” di sistema
o JS, Groovy, JRuby… linguaggi high-level applicativi
● JVM sempre più poliglotta
o Rispetto a .net, l’ecosistema sembra più attivo
● Mobile: Android.
32. Considerazioni (personali!)
Java 1 era un linguaggio familiare, semplice e
che portava nel mainstream molte feature di
linguaggi e ambienti più “oscuri” o accademici.
Java 5: più complessità (generics, autoboxing).
Java 8: ancora più complessità (lambda,
streams, default methods).
33. Considerazioni (personali!)
Java oggi è un linguaggio maturo, evoluto
gradualmente e quindi complicato. Non sarà
C++, ma ci si è avvicinato!
Insegnereste Java ad un ragazzino?
Java è il nuovo C++, il nuovo COBOL?
34. Considerazioni (personali!)
La JVM è qui per rimanere ancora a lungo.
La JVM rimane legata a Java.
Il programmatore Java deve diventare
programmatore JVM e conoscere anche altri
linguaggi (come con UNIX/C).