Vous êtes sur la page 1sur 38

Nouveautés Java 8 - Java 9

M. Assane SECK

1
Date, String, Optional

2
Date
 Java 8 arrive avec une nouvelle API pour la gestion du temps, dans le package
java.time. Elle est inspirée de la librairie Joda-Time. Stephen Colebourne, créateur
de JodaTime, a participé à l'élaboration de celle-ci. Son but est de combler les
défauts des vieillissantes API Date (JDK 1.0) et Calendar (JDK 1.1) en introduisant
de nouveaux concepts :
INSTANT
Instant start = Instant.now();
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
long millis = elapsed.toMillis() ;
long second = elapsed.getSeconds() ;

PERIOD
LocalDate now = LocalDate.now() ;
LocalDate shakespeareDoB =
LocalDate.of(1564, Month.APRIL, 23) ;
Period p = shakespeareDoB.until(now) ;
System.out.println("# years = " + p.getYears()) ;
System.out.println("# years = " + shakespeareDoB.until(now, ChronoUnit.YEARS)) ;
long days = shakespeareDoB.until(now, ChronoUnit.DAYS) ;
System.out.println("# days = " + days) ; // 164_354

3
Date
ZonedDateTime

ZonedDateTime.of(
LocalDate.of(2014, Month.APRIL, 18),
LocalTime.of (9, 30),
ZoneId.of("Europe/London")
);

TemporalAdjuster

LocalDate now = LocalDate.now() ;


LocalDate nextSunday = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)) ;
System.out.println("# nextSunday = " + nextSunday) ;
System.out.println("# firstDayOfMonth = " +now.with(TemporalAdjusters.firstDayOfMonth())) ;

4
Date
Afficher la date complète dans 9 jours à partir de maintenant
Ancienne pratique
Ancienne pratique
Date dt = new Date();
Calendar c = Calendar.getInstance();
c.setTime(dt);
c.add(Calendar.DAY_OF_MONTH, 9);
dt = c.getTime();
System.out.println(dt);

Joda Time
Date dt = new Date();
DateTime dtOrg = new DateTime(dt);
DateTime dtPlusOne = dtOrg.plusDays(9);
System.out.println(dt);
Nouvelle pratique

LocalDateTime date = LocalDateTime.now();


System.out.println(date.plusDays(9));
5
String
 La classe String bénéficie également de la notion de Stream.
 Les éléments de la Stream représentent les caractères de la chaîne de caractères.
Une nouvelle façon de concaténer des String fait également son apparition avec
l'API StringJoiner.
 Elle permet de réaliser des concaténations avancées avec la possibilité d'ajouter des
chaînes de caractères au début et à la fin de la String. Une méthode statique
« join » de String permet maintenant de concaténer des chaînes de caractères.

StringJoiner sj = new StringJoiner(", ", "{", "}");


sj.add("one").add("two").add("three");
System.out.println(sj.toString()) ;

{ one, two, three }

6
String
 Afficher sous forme de chaine de caractère le contenu d‟un tableau séparé par le
caractère „,'

Ancienne pratique

String[] tab = { "one", "two", "three" };


String message = "";
for (int i = 0; i < tab.length; i++) {
message = message + tab[i] + ",";
}
if (message.endsWith(","))
message = message.substring(0, message.length() - 1);

System.out.println(message); one, two, three

Nouvelle pratique

String[] tab = { "one", "two", "three" };


String message = String.join(", ", tab);
System.out.println(message); one, two, three

7
Optional
 C‟est un conteneur pour une valeur qui peut être null.
 Ce conteneur possède deux états, contenant une valeur ou ne contenant
rien.
 Retourner un Optional à la place d‟un null permet d‟obliger le traitement
du cas “pas de valeur de retour”.

//Optional.ofNullable - allows passed parameter to be null. NoSuchElementException just for


get, other method work--->a.get()
Optional<Integer> a = Optional.ofNullable(null);
System.out.println(a.get());
//Optional.of - throws NullPointerException if passed parameter is null ---> for AllMethod
Optional<Integer> b = Optional.of(null); //this line generate exception
Optional<Integer> c = Optional.ofNullable(100);
System.out.println(c.isPresent());
System.out.println(c.orElse(15)); //---> return 15 if element is absent
Optional.ofNullable(null);
System.out.println(c.get());

8
Optional

9
Lamda

10
Lambda
 Java ne propose pas la possibilité de définir une fonction/méthode en dehors
d'une classe ni de passer une telle fonction en paramètre d'une méthode.
Depuis Java 1.1, la solution pour passer des traitements en paramètres
d'une méthode est d'utiliser les classes anonymes internes.

monBouton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("clic");
}
});

Pour faciliter, entre autres, cette mise à oeuvre, Java 8 propose les
expressions lambda. Les expressions lambda sont aussi nommées closures
ou fonctions anonymes : leur but principal est de permettre de passer en
paramètre un ensemble de traitements.

11
Lambda
Operation operation = new Operation() {
@Override
public float calculer(float a, float b) {
return a + b;
}
};

Operation addition = (a, b) -> a + b;

monBouton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("clic");
}
});
monBouton.addActionListener(event-> System.out.println("clic"));

12
Stream

13
Stream
 C’est une interface paramétrée, « un stream de String »
 Conceptuellement, c‟est un Objet qui sert à définir des
opérations.
 D‟autres interfaces pour les types primitifs : IntStream, LongStream, DoubleStream

 Il ne porte pas les données qu‟il traite


 Il se connecte à une source de données, consomme et définit
des opérations
 Il peut traité ses données en une seule « passe »
 Il peut traité ses données en parallèle

14
Intérêt d’un Stream ?
Objectif :

 Gestion efficace des gros/petits volumes de données


 Simplicité de l‟écriture des traitements associés

Avantage:

 Exploiter le multicoeur par la parallélisation des traitements


 Définir des opérations en pipeline, éviter les traitements
intermédiaires

15
Méthode forEach/peek()
myStream.forEach( t -> System.out.println(t) );

Après forEach, impossible d’un autre appel, car c’est un appel terminal

myStream.peek(System.out::println).count();

Après peek, possible d‟un autre appel, car c‟est un appel termina

count() est un appel terminal, permet le déclenchement de la


méthode peek et elle-même

peek() c’est un appel intermédiaire contrairement à forEach()

16
Stream
List<String> persons = Arrays.asList("Assane Seck", "Moussa Ndiaye", "Oumy Seck");

List<String> result = new ArrayList<>();

for (Iterator iterator = persons.iterator(); iterator.hasNext();) {


String person = (String) iterator.next();

if (person.contains("Seck")) {
result.add(person.substring(0, person.indexOf(" ")).toUpperCase() + "_test");
System.out.println(person.substring(0, 1).toUpperCase() + "_test");
}
}

persons
.stream()
.filter(x -> x.contains("Seck"))
.map(x -> x.substring(0, x.indexOf(" ")).toUpperCase() + "_test")
.collect(Collectors.toList())
.forEach( System.out::println );
17
Stream et Performance
 Stream<T> versus IntStream, LongStream, DoubleStream
list.stream() // Stream<Transaction>
.map(Transaction::getMontant) // Stream<Double> boxing
.filter(montant -> montant > 5000) // Stream<Double> re-boxing re-
.sum() ; // no such sum() method on Stream<T>

list.stream()
.map(Transaction::getMontant)
.filter(montant -> montant > 5000) // Stream<Double> boxing
.mapToDouble(montant -> montant) // Règle l’appel de sum()
.sum() ;

Double sumTrans=
list.stream()
.mapToDouble(Transaction::getMontant) DoubleStream //Bcp + Optimale
.filter(montant -> montant > 5000) DoubleStream
.sum() ;

18
Stream et Performance

DoubleSummaryStatistics stats = list


.stream()
.mapToDouble(Transaction::getMontant)
.filter(montant -> montant > 5000)
.summaryStatistics() ;

System.out.println("Moyenne: "+stats.getAverage());
System.out.println("Total: "+stats.getCount());
System.out.println("Maximum: "+stats.getMax());
System.out.println("Minimum: "+stats.getMin());
System.out.println("Somme: "+stats.getSum());

19
Stream et Performance
 Comment construire un stream parallel ?
 La parallelisation se base sur le Fork/Join
 Imposer le nombre de cœur sur lequel le FJ pool va s‟executer
 Imposer le FJ Pool lui même
 Par défaut un parallel streams utilise « fork join common pool », definit au
niveau de la JVM
 Le taux de parallelisme de ce pool est le nombre de cœur disponible

Stream<Transaction> stream1 = list.parallelStream() ;


Stream<Transaction> stream2 = list.stream().parallel() ;

20
I/O

21
I/O
Java 8 NIO est construit sur l‟API NIO de Java 7. La plupart des
ajouts permettent d‟obtenir un java.util.stream.Stream à partir d‟un
fichier ou d‟un InputStream.

Ce Stream implémente l‟interface AutoCloseable et peut donc


utiliser le try-with-resources introduit en java 7 et permettant la
gestion automatique des ressources.

Un exemple permettant d‟afficher chaque ligne d‟un fichier :

22
I/O
String csvFile = "files\\test.csv";
BufferedReader br = null;
String line = "";
try {
br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) { Path path = Paths.get("files", "test.csv");
e.printStackTrace(); try (Stream<String>stream = Files.lines(path))
} catch (IOException e) { {
e.printStackTrace(); stream.forEach(System.out::println);
} finally {
}
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

23
I/O
path = Paths.get("c:", "windows");
try (Stream<Path> stream = Files.list(path)) {

stream.filter(path2 -> path2.toFile().isDirectory())


.forEach(System.out::println);

} catch (IOException ioe) {


}

try (Stream<Path> stream = Files.walk(path)) { //Files.walk(path,2)

stream.filter(path3 -> path3.toFile().isDirectory())


.forEach(System.out::println);

} catch (IOException ioe) {

24
Concurence
ConcurentHashMap a été complètement réécrite. Cette implémentation est thread-safe et
n’utilise pas de lock. Cette nouvelle version représente 6000 lignes de code, 54 classes
membres et des nouveaux patterns. Elle reste compatible avec les applications écrites pour
les versions antérieures, on remarque aussi que la sérialisation fonctionne entre les
implémentations V7 et V8. Comme pour les collections, elle a également son lot de
nouvelles méthodes pour la recherche, les itérations et les réductions.
Un exemple d’itérations avec la méthode forEach(), le premier paramètre correspond au
taux de parallélisme. Si la taille est supérieure à 10 éléments, la recherche se fait en
parallèle.

Pour des besoins plus spécifiques, on peut itérer sur les clés forEachKey() ou sur les
valeurs forEachValue().

ConcurrentHashMap<Integer, String> map = ... ;


map.forEach(10,
(key, value) ->
System.out.println(String.join(key, "->", value)
);

25
JMH

26
JMH
Java Microbenchmark Harness, est un framework de microbenchmarking

Utile pour mesurer les performances d’un code java, comparer 2


implémentations différentes d’un algorithme

 @Benchmark

// 10 warm up iterations without measures

@Warmup(iterations = 10, time = 2000, timeUnit = TimeUnit.MILLISECONDS)

// 20 iterations of 2000ms each

@Measurement (iterations = 20, time = 2000, timeUnit = TimeUnit.MILLISECONDS)

27
Nouveautés Java 9

28
Modularisation: Jigsaw
 Une plateforme plus facilement évolutive et maintenable

 Des gains en termes de performance et d'exécution puisque


seuls les modules nécessaires sont chargés ;

 Des gains en termes de sécurité, car le principe modulaire


permet de fournir le juste assez nécessaire au système

 un fichier module-info.java est requis à la racine de votre projet


module com.dif {
requires java.sql;
export com,sn.dif.services;
}
29
Fabriques pour les collections
List<String> myList = new ArrayList<String>();
myList.add("Abdou");
myList.add("Fatou");
myList.add("Astou");
myList = Collections.unmodifiableList(myList);

Java 9
List<String> newList = List.of("Abdou", "Fatou", "Astou")

30
Meilleure gestion du deprecated
L‟annotation @Deprecated a été étoffée par deux attributs : l‟un
de type String since et l‟autre de type boolean forRemoval (JEP
277). L‟attribut since permet de préciser à partir de quand l‟API a
été annotée par @Deprecated et forRemoval précise que l‟API
en question risque d‟être supprimée

@Deprecated(since="2.5" forRemoval=false)

public class MyClass

31
Meilleure gestion du deprecated
L‟annotation @Deprecated a été étoffée par deux attributs : l‟un
de type String since et l‟autre de type boolean forRemoval (JEP
277). L‟attribut since permet de préciser à partir de quand l‟API a
été annotée par @Deprecated et forRemoval précise que l‟API
en question risque d‟être supprimée

@Deprecated(since="2.5" forRemoval=false)

public class MyClass

32
Try-with-resources

33
Méthodes privées dans les interfaces

34
L’identifiant _

35
SHA-3
En 2005, des problèmes de sécurité de SHA-1 ont été mis en évidence : il existe
pour la recherche de collisions une attaque théorique nettement plus rapide que
l'attaque générique des anniversaires sur les fonctions de hachage

36
Liens utiles
JMH:
https://blog.netapsys.fr/introduction-a-jmh/
http://soat.developpez.com/tutoriels/java/comprendre-fonctionnement-
jmh/#LII-B
Java-8 Nouveautés
http://blog.soat.fr/2014/04/devoxxfr-2014-50-nouvelles-choses-que-lon-peut-
faire-avec-java-8/
http://blog.paumard.org/category/java-8/
Devox France José Paumard
Java 9
https://java.developpez.com/actu/160955/Java-9-est-disponible-la-plateforme-
se-met-aux-modules-tour-d-horizon-des-nouveautes/
http://tekcollab.imdeo.com/java-9-quelles-nouveautes/
Devox France JMD
37
Merci pour votre attention
?

38

Vous aimerez peut-être aussi