SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Java 8
Impressioni sul futuro
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
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.
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.
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.)
Le lambda expression
Nei linguaggi funzionali sono una notazione per
funzioni anonime.
Closure = funzione (anonima o meno) che
cattura variabili locali.
Le lambda expression
Java non è un linguaggio funzionale…
Cos’è una funzione in Java?
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)
Le lambda expression
Lambda expression =
sintassi concisa per tipi SAM anonimi = (più o meno)
anonymous inner class con un solo metodo
Le lambda expression
Callable<Integer> callable =
new Callable<Integer>() {
public Integer call() {
return 42;
}
};
Le lambda expression
Callable<Integer> callable = () -> 42;
^^^^^^^^^^^^^^^^^ ^^^^^^^^^
Tipo di destinazione Lambda
(target type) expression
Dev’essere un’interfaccia
con un solo metodo
Method references
Callable<Integer> callable =
someObject::someMethod;
Callable<Integer> callable =
(SomeClass someObject) ->
someObject.someMethod();
Method references
Callable<Integer> callable =
SomeClass::someMethod;
Callable<Integer> callable =
() -> SomeClass.someMethod();
Le lambda expression
Tanto rumore per nulla?
Le anonymous inner classes…
esistono da Java 1.1!
Le lambda expression
Sintassi più pratica = maggiore possibilità di
utilizzo
API che combinano tanti piccoli comportamenti
diventano una possibilità: vediamo l’esempio
Streams API
Streams ~= lazy collections
Uno stream esprime un’iterazione
sequenziale o parallela
con possibili trasformazioni (map), filtri,
estrazioni, accumulazioni (reduce) ecc.
Streams API
List<String> names = new ArrayList<>();
for(Student student : students){
if(student.getName().startsWith("A")){
names.add(student.getName());
}
}
Streams API
List<Student> students = ...;
List<String> names =
students.stream()
.filter(s ->
s.getName().startsWith("A"))
.map(Student::getName)
.collect(Collectors.toList());
Streams API
List<Student> students = ...;
List<String> names =
students.stream()
.parallel()
.filter(s ->
s.getName().startsWith("A"))
.map(Student::getName)
.collect(Collectors.toList());
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?
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.
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.
Nashorn
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).
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
Nashorn
var stack = new java.util.LinkedList();
[1, 2, 3, 4].forEach(function(item) {
stack.push(item);
});
var sorted =
stack.stream().sorted().toArray();
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
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!
Non abbiamo parlato di…
● JavaFX
● Profiles
● Security
● JDBC
● Annotations
● Utils, concurrency
● Networking
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!
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.
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).
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?
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).

Weitere ähnliche Inhalte

Was ist angesagt?

LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsJUG Genova
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaCristina Attori
 
Closure Visto Da Vicino
Closure Visto Da VicinoClosure Visto Da Vicino
Closure Visto Da Vicinodavide ficano
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webRoberto Messora
 
PHP Object Injection in Joomla...questo sconosciuto!
PHP Object Injection in Joomla...questo sconosciuto!PHP Object Injection in Joomla...questo sconosciuto!
PHP Object Injection in Joomla...questo sconosciuto!_EgiX
 
Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Carmelantonio Zolfo
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 
[BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA][BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA]Matteo Collica
 
Drupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e DrupalDrupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e DrupalDrupalDay
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 

Was ist angesagt? (20)

Java Advanced
Java AdvancedJava Advanced
Java Advanced
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
LINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMsLINQ, Entities Framework & ORMs
LINQ, Entities Framework & ORMs
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in Java
 
Closure Visto Da Vicino
Closure Visto Da VicinoClosure Visto Da Vicino
Closure Visto Da Vicino
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il web
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Design Pattern
Design PatternDesign Pattern
Design Pattern
 
Jpnde
JpndeJpnde
Jpnde
 
Vb.Net
Vb.NetVb.Net
Vb.Net
 
Java per as400
Java per as400Java per as400
Java per as400
 
PHP Object Injection in Joomla...questo sconosciuto!
PHP Object Injection in Joomla...questo sconosciuto!PHP Object Injection in Joomla...questo sconosciuto!
PHP Object Injection in Joomla...questo sconosciuto!
 
Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)Test double - un'introduzione (PHP)
Test double - un'introduzione (PHP)
 
Dsl in Lisp e Java
Dsl in Lisp e JavaDsl in Lisp e Java
Dsl in Lisp e Java
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side Javascript
 
[BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA][BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA]
 
Eclipse and Java
Eclipse and JavaEclipse and Java
Eclipse and Java
 
Drupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e DrupalDrupal Day 2011 - Node.js e Drupal
Drupal Day 2011 - Node.js e Drupal
 
Corso java base
Corso java baseCorso java base
Corso java base
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 

Andere mochten auch

Sviluppare applicazioni android
Sviluppare applicazioni androidSviluppare applicazioni android
Sviluppare applicazioni androidPaolo Montalto
 
AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013
AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013
AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013Carlo Bonamico
 
Playing with parse.com
Playing with parse.comPlaying with parse.com
Playing with parse.comJUG Genova
 
Java 9 by Alessio Stalla
Java 9 by Alessio StallaJava 9 by Alessio Stalla
Java 9 by Alessio StallaJUG Genova
 
ממד
ממדממד
ממדelio2b
 
Through the eyes of young observers: Geographers Imagine, Image and Create Fu...
Through the eyes of young observers: Geographers Imagine, Image and Create Fu...Through the eyes of young observers: Geographers Imagine, Image and Create Fu...
Through the eyes of young observers: Geographers Imagine, Image and Create Fu...becnicholas
 
Asstra Liquid&Bulked Ru
Asstra Liquid&Bulked RuAsstra Liquid&Bulked Ru
Asstra Liquid&Bulked RuPavel Red'ko
 
Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...
Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...
Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...CBTAdvisors
 
Announcements Checkin
Announcements CheckinAnnouncements Checkin
Announcements CheckinDee Simpson
 
Power Point Etiquette
Power Point EtiquettePower Point Etiquette
Power Point Etiquettegueste9b3f
 
E learning course template
E learning course templateE learning course template
E learning course templateLee Bandy
 
Summary Of Dissertation Presentation
Summary Of Dissertation PresentationSummary Of Dissertation Presentation
Summary Of Dissertation Presentationcmhusted
 

Andere mochten auch (20)

Java lezione 8
Java lezione 8Java lezione 8
Java lezione 8
 
OOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni LambdaOOP Scano di Montiferro - Java 8: Espressioni Lambda
OOP Scano di Montiferro - Java 8: Espressioni Lambda
 
Sviluppare applicazioni android
Sviluppare applicazioni androidSviluppare applicazioni android
Sviluppare applicazioni android
 
AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013
AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013
AngularJS: How to code today with tomorrow tools - Codemotion Milan 2013
 
JMeter
JMeterJMeter
JMeter
 
Playing with parse.com
Playing with parse.comPlaying with parse.com
Playing with parse.com
 
Java 9 by Alessio Stalla
Java 9 by Alessio StallaJava 9 by Alessio Stalla
Java 9 by Alessio Stalla
 
EIP with Apache Camel
EIP with Apache CamelEIP with Apache Camel
EIP with Apache Camel
 
8. Architetture web
8. Architetture web8. Architetture web
8. Architetture web
 
ממד
ממדממד
ממד
 
Through the eyes of young observers: Geographers Imagine, Image and Create Fu...
Through the eyes of young observers: Geographers Imagine, Image and Create Fu...Through the eyes of young observers: Geographers Imagine, Image and Create Fu...
Through the eyes of young observers: Geographers Imagine, Image and Create Fu...
 
First Partial Review
First Partial ReviewFirst Partial Review
First Partial Review
 
Asstra Liquid&Bulked Ru
Asstra Liquid&Bulked RuAsstra Liquid&Bulked Ru
Asstra Liquid&Bulked Ru
 
Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...
Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...
Steve Dickman CBT Advisors Moderator Slides For Wolfe Personalized Med Panel ...
 
Announcements Checkin
Announcements CheckinAnnouncements Checkin
Announcements Checkin
 
Power Point Etiquette
Power Point EtiquettePower Point Etiquette
Power Point Etiquette
 
Banking CH 17
Banking CH 17Banking CH 17
Banking CH 17
 
2º cuaresma
2º cuaresma2º cuaresma
2º cuaresma
 
E learning course template
E learning course templateE learning course template
E learning course template
 
Summary Of Dissertation Presentation
Summary Of Dissertation PresentationSummary Of Dissertation Presentation
Summary Of Dissertation Presentation
 

Ähnlich wie Java 8

Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Massimiliano Dessì
 
Java SE 5. Capitolo 01: Base
 Java SE 5. Capitolo 01: Base Java SE 5. Capitolo 01: Base
Java SE 5. Capitolo 01: Basebobpuley
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
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
 
Introduzione a JavaScript e jQuery (1/2)
Introduzione a JavaScript e jQuery (1/2)Introduzione a JavaScript e jQuery (1/2)
Introduzione a JavaScript e jQuery (1/2)Giuseppe Vizzari
 
Introduzione a Ruby On Rails
Introduzione a Ruby On RailsIntroduzione a Ruby On Rails
Introduzione a Ruby On RailsLuca Mearelli
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascriptPiero Bozzolo
 
React JS + ES6
React JS + ES6React JS + ES6
React JS + ES6NaLUG
 
Webbit 2004: Aspectj
Webbit 2004: AspectjWebbit 2004: Aspectj
Webbit 2004: AspectjMatteo Baccan
 
Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parteOnofrio Panzarino
 
Introduzione al java
Introduzione al javaIntroduzione al java
Introduzione al javaGiovanni Pace
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPGiorgio Cefaro
 
Groovy e Domain Specific Languages
Groovy e Domain Specific LanguagesGroovy e Domain Specific Languages
Groovy e Domain Specific LanguagesTiziano Lattisi
 
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxProgettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxGiovanni Cappellini
 
High Level Synthesis Using Esterel
High Level Synthesis Using EsterelHigh Level Synthesis Using Esterel
High Level Synthesis Using EsterelAlberto Minetti
 

Ähnlich wie Java 8 (20)

Presentazione java7
Presentazione java7Presentazione java7
Presentazione java7
 
Scala Programming Linux Day 2009
Scala Programming Linux Day 2009Scala Programming Linux Day 2009
Scala Programming Linux Day 2009
 
Java SE 5. Capitolo 01: Base
 Java SE 5. Capitolo 01: Base Java SE 5. Capitolo 01: Base
Java SE 5. Capitolo 01: Base
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
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
 
Introduzione a JavaScript e jQuery (1/2)
Introduzione a JavaScript e jQuery (1/2)Introduzione a JavaScript e jQuery (1/2)
Introduzione a JavaScript e jQuery (1/2)
 
Introduzione a Ruby On Rails
Introduzione a Ruby On RailsIntroduzione a Ruby On Rails
Introduzione a Ruby On Rails
 
Testing in javascript
Testing in javascriptTesting in javascript
Testing in javascript
 
React JS + ES6
React JS + ES6React JS + ES6
React JS + ES6
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Webbit 2004: Aspectj
Webbit 2004: AspectjWebbit 2004: Aspectj
Webbit 2004: Aspectj
 
Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parte
 
Java basics
Java basicsJava basics
Java basics
 
Introduzione al java
Introduzione al javaIntroduzione al java
Introduzione al java
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
 
Groovy e Domain Specific Languages
Groovy e Domain Specific LanguagesGroovy e Domain Specific Languages
Groovy e Domain Specific Languages
 
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e AjaxProgettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
Progettazione e sviluppo di applicazioni web 2.0 con PHP e Ajax
 
Java introduzione
Java introduzioneJava introduzione
Java introduzione
 
Ddive Xpage852
Ddive Xpage852Ddive Xpage852
Ddive Xpage852
 
High Level Synthesis Using Esterel
High Level Synthesis Using EsterelHigh Level Synthesis Using Esterel
High Level Synthesis Using Esterel
 

Java 8

  • 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.
  • 7. Le lambda expression Java non è un linguaggio funzionale… Cos’è una funzione in Java?
  • 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
  • 10. Le lambda expression Callable<Integer> callable = new Callable<Integer>() { public Integer call() { return 42; } };
  • 11. Le lambda expression Callable<Integer> callable = () -> 42; ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ Tipo di destinazione Lambda (target type) expression Dev’essere un’interfaccia con un solo metodo
  • 12. Method references Callable<Integer> callable = someObject::someMethod; Callable<Integer> callable = (SomeClass someObject) -> someObject.someMethod();
  • 13. Method references Callable<Integer> callable = SomeClass::someMethod; Callable<Integer> callable = () -> SomeClass.someMethod();
  • 14. Le lambda expression Tanto rumore per nulla? Le anonymous inner classes… esistono da Java 1.1!
  • 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!
  • 29. Non abbiamo parlato di… ● JavaFX ● Profiles ● Security ● JDBC ● Annotations ● Utils, concurrency ● Networking
  • 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).