Académique Documents
Professionnel Documents
Culture Documents
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
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
6
String
Afficher sous forme de chaine de caractère le contenu d‟un tableau séparé par le
caractère „,'
Ancienne pratique
Nouvelle pratique
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”.
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;
}
};
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
14
Intérêt d’un Stream ?
Objectif :
Avantage:
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
16
Stream
List<String> persons = Arrays.asList("Assane Seck", "Moussa Ndiaye", "Oumy Seck");
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
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
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.
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)) {
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().
25
JMH
26
JMH
Java Microbenchmark Harness, est un framework de microbenchmarking
@Benchmark
27
Nouveautés Java 9
28
Modularisation: Jigsaw
Une plateforme plus facilement évolutive et maintenable
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)
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)
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