50 nouvelles choses que l'on peut faire en java 8
DESCRIPTION
Slides de ma présentation à Codeurs en Seine 2014. Version augmentée de celle de Devoxx France 2014.TRANSCRIPT
![Page 1: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/1.jpg)
@JosePaumard
nouvelles choses que l’on peut faire avec
Java
![Page 2: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/2.jpg)
@JosePaumard
Java
nouvelles choses que l’on peut faire avec
![Page 3: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/3.jpg)
@JosePaumard
Java
nouvelles choses que l’on peut faire avec
![Page 4: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/4.jpg)
![Page 5: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/5.jpg)
![Page 6: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/6.jpg)
![Page 7: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/7.jpg)
![Page 8: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/8.jpg)
![Page 9: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/9.jpg)
@JosePaumard #50new8
Questions ?
#50new8
![Page 10: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/10.jpg)
Date
![Page 11: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/11.jpg)
@JosePaumard #50new8
Date : Instant
Un Instant est un point sur une timeline
Instant start = Instant.now() ; Instant end = Instant.now() ;
![Page 12: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/12.jpg)
@JosePaumard #50new8
Date : Duration
Une « duration » est le temps entre deux Instant
Instant start = Instant.now() ; Instant end = Instant.now() ;
Duration elapsed = Duration.between(start, end) ; long millis = elapsed.toMillis() ;
![Page 13: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/13.jpg)
@JosePaumard #50new8
Date : Duration
On a une arithmétique sur les « Duration »
Instant start = Instant.now() ; Instant end = Instant.now() ;
Duration elapsed = Duration.between(start, end) ; long millis = elapsed.toMillis() ;
elapsed.plus(2L, TemporalUnit.SECONDS) ;
![Page 14: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/14.jpg)
@JosePaumard #50new8
Date : Duration
La précision de la time line est de 10-9 s (nanosecond)
![Page 15: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/15.jpg)
@JosePaumard #50new8
Date : Duration
La précision de la time line est de 10-9 s (nanosecond) Bonne précision ?
![Page 16: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/16.jpg)
@JosePaumard #50new8
Date : Duration
La précision de la time line est de 10-9 s (nanosecond) Bonne précision ? La demie-vie du
boson de Higgs est de 10-23 s
![Page 17: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/17.jpg)
@JosePaumard #50new8
Date : LocalDate
Une « LocalDate » est une date de tous les jours
LocalDate now = LocalDate.now() ; LocalDate shakespeareDoB = LocaleDate.of(1564, Month.APRIL, 23) ;
![Page 18: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/18.jpg)
@JosePaumard #50new8
Date : Period
Une « Period » est le temps entre deux LocalDate
LocalDate now = LocalDate.now() ; LocalDate shakespeareDoB = LocaleDate.of(1564, Month.APRIL, 23) ; Period p = shakespeareDoB.until(now) ; System.out.println("# years = " + p.getYears()) ;
![Page 19: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/19.jpg)
@JosePaumard #50new8
Date : Period
Une « Period » est le temps entre deux LocalDate
LocalDate now = LocalDate.now() ; LocalDate shakespeareDoB = LocaleDate.of(1564, Month.APRIL, 23) ; Period p = shakespeareDoB.until(now) ; System.out.println("# years = " + p.getYears()) ;
long days = shakespeareDoB.until(now, ChronoUnit.DAYS) ; System.out.println("# days = " + days) ;
![Page 20: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/20.jpg)
@JosePaumard #50new8
Date : TemporalAdjuster
On a une arithmétique sur les « local date »
LocalDate now = LocalDate.now() ; LocalDate nextSunday = now.with(TemporalAdjuster.next(DayOfWeek.SUNDAY)) ;
![Page 21: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/21.jpg)
@JosePaumard #50new8
Date : TemporalAdjuster
On a une arithmétique sur les « local date » Une boîte à outils de 14 méthodes statiques firstDayOfMonth(), lastDayOfYear() firstDayOfNextMonth()
LocalDate now = LocalDate.now() ; LocalDate nextSunday = now.with(TemporalAdjuster.next(DayOfWeek.SUNDAY)) ;
![Page 22: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/22.jpg)
@JosePaumard #50new8
Date : TemporalAdjuster
On a une arithmétique sur les « local date » Une boîte à outils de 14 méthodes statiques firstInMonth(DayOfWeek.MONDAY) next(DayOfWeek.FRIDAY)
LocalDate now = LocalDate.now() ; LocalDate nextSunday = now.with(TemporalAdjuster.next(DayOfWeek.SUNDAY)) ;
![Page 23: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/23.jpg)
@JosePaumard #50new8
Date : LocalTime
Un « LocalTime » est un heure de tous les jours : ex. 10:20
LocalTime now = LocalTime.now() ; LocalTime time = LocalTime.of(10, 20) ; // 10:20
![Page 24: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/24.jpg)
@JosePaumard #50new8
Date : LocalTime
Un « LocalTime » est un heure de tous les jours : ex. 10:20
LocalTime now = LocalTime.now() ; LocalTime time = LocalTime.of(10, 20) ; // 10:20
LocalTime lunchTime = LocalTime.of(12, 30) ; LocalTime coffeeTime = lunchTime.plusHours(2) ; // 14:20
![Page 25: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/25.jpg)
@JosePaumard #50new8
Date : ZonedTime
Utiles pour les dates localisées
Set<String> allZonesIds = ZoneId.getAvailableZoneIds() ; String ukTZ = ZoneId.of("Europe/London") ;
![Page 26: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/26.jpg)
@JosePaumard #50new8
Date : ZonedTime
Utiles pour les dates localisées
System.out.println( ZonedDateTime.of( 1564, Month.APRIL.getValue(), 23, // year / month / day 10, 0, 0, 0, // h / mn / s / nanos ZoneId.of("Europe/London")) ); // prints 1564-04-23T10:00-00:01:15[Europe/London]
![Page 27: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/27.jpg)
@JosePaumard #50new8
Date : ZonedTime
On a aussi une arithmétique dessus
ZonedDateTime currentMeeting = ZonedDateTime.of( LocalDate.of(2014, Month.APRIL, 18), // LocalDate LocalTime.of(9, 30), // LocalTime ZoneId.of("Europe/London") ); ZonedDateTime nextMeeting = currentMeeting.plus(Period.ofMonth(1));
![Page 28: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/28.jpg)
@JosePaumard #50new8
Date : ZonedTime
On a aussi une arithmétique dessus
ZonedDateTime currentMeeting = ZonedDateTime.of( LocalDate.of(2014, Month.APRIL, 18), // LocalDate LocalTime.of(9, 30), // LocalTime ZoneId.of("Europe/London") ); ZonedDateTime nextMeeting = currentMeeting.plus(Period.ofMonth(1)) ; ZonedDateTime nextMeetingUS = nextMeeting.withZoneSameInstant(ZoneId.of("US/Central")) ;
![Page 29: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/29.jpg)
@JosePaumard #50new8
Date : Formatter
Classe factory : DateTimeFormatter
ZonedDateTime nextMeetingUS = nextMeeting.withZoneSameInstant(ZoneId.of("US/Central")); System.out.println( DateTimeFormatter.ISO_DATE_TIME.format(nextMeetingUS) ); // prints 2014-04-12T03:30:00-05:00[US/Central] System.out.println( DateTimeFormatter.RFC_1123_DATE_TIME.format(nextMeetingUS) ); // prints Sat, 12 Apr 2014 03:30:00 -0500
![Page 30: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/30.jpg)
@JosePaumard #50new8
Date : liens avec java.util.Date
Date & Time API vs java.util.Date
Date date = Date.from(instant); // API -> legacy Instant instant = date.toInstant(); // legacy -> new API
![Page 31: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/31.jpg)
@JosePaumard #50new8
Date : liens avec java.util.Date
Date & Time API vs java.util.Date
TimeStamp time = TimeStamp.from(instant); // API -> legacy Instant instant = time.toInstant(); // legacy -> new API
Date date = Date.from(instant); // API -> legacy Instant instant = date.toInstant(); // legacy -> new API
![Page 32: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/32.jpg)
@JosePaumard #50new8
Date : liens avec java.util.Date
Date & Time API vs java.util.Date
Date date = Date.from(localDate); // API -> legacy LocalDate localDate = date.toLocalDate(); // legacy -> new API
TimeStamp time = TimeStamp.from(instant); // API -> legacy Instant instant = time.toInstant(); // legacy -> new API
Date date = Date.from(instant); // API -> legacy Instant instant = date.toInstant(); // legacy -> new API
![Page 33: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/33.jpg)
@JosePaumard #50new8
Date : liens avec java.util.Date
Date & Time API vs java.util.Date
Time time = Time.from(localTime); // API -> legacy LocalTime localTime = time.toLocalTime(); // legacy -> new API
Date date = Date.from(localDate); // API -> legacy LocalDate localDate = date.toLocalDate(); // legacy -> new API
TimeStamp time = TimeStamp.from(instant); // API -> legacy Instant instant = time.toInstant(); // legacy -> new API
Date date = Date.from(instant); // API -> legacy Instant instant = date.toInstant(); // legacy -> new API
![Page 34: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/34.jpg)
String
![Page 35: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/35.jpg)
@JosePaumard #50new8
String : Stream
Un Stream sur les lettres qui composent une String
String s = "hello"; IntStream stream = s.chars(); // stream on the letters of s
![Page 36: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/36.jpg)
@JosePaumard #50new8
String : Stream
Un Stream sur les lettres qui composent une String
String s = "hello"; IntStream stream = s.chars(); // stream on the letters of s s.chars() .map(Character::toUpperCase) .forEach(System.out::println);
![Page 37: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/37.jpg)
@JosePaumard #50new8
String : Stream
Un Stream sur les lettres qui composent une String
String s = "hello"; IntStream stream = s.chars(); // stream on the letters of s s.chars() .map(Character::toUpperCase) .forEach(System.out::println);
> HELLO 7269767679
![Page 38: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/38.jpg)
@JosePaumard #50new8
String : Stream
Un Stream sur les lettres qui composent une String
String s = "hello"; IntStream stream = s.chars(); // stream on the letters of s s.chars() // IntStream .map(Character::toUpperCase) .forEach(System.out::println); // Prints an int!
> 7269767679
![Page 39: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/39.jpg)
@JosePaumard #50new8
String : Stream
Un Stream sur les lettres qui composent une String
String s = "hello"; IntStream stream = s.chars(); // stream on the letters of s s.chars() // IntStream .mapToObj(letter -> (char)letter) // Stream<Character> .map(Character::toUpperCase) .forEach(System.out::println); // Prints a Character
> HELLO
![Page 40: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/40.jpg)
@JosePaumard #50new8
String : expressions régulières
Un Stream sur une expression régulière
// book is a looooooooong String Stream<String> words = Pattern .compile("[^\\p{javaLetter}]") .splitAsStream(book) ;
![Page 41: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/41.jpg)
@JosePaumard #50new8
String : concaténation
Le débutant écrit :
String s1 = "hello" ; String s2 = " world!" ; String s3 = s1 + " " + s2 ;
![Page 42: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/42.jpg)
@JosePaumard #50new8
String : concaténation
L’ignorant lui dit d’écrire :
StringBuffer sb1 = new StringBuffer("hello") ; sb1.append(" world") ; String s3 = sb1.toString() ;
(et il a tord)
![Page 43: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/43.jpg)
@JosePaumard #50new8
String : concaténation
Le développeur expérimenté lui dit d’écrire :
StringBuilder sb1 = new StringBuilder("hello") ; sb1.append(" world") ; String s3 = sb1.toString() ;
(et il se trompe aussi…)
![Page 44: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/44.jpg)
@JosePaumard #50new8
String : concaténation
Parce que le débutant a raison (même s’il ne le sait pas)
String s1 = "hello" ; String s2 = " world!" ; String s3 = s1 + " " + s2 ; LINENUMBER 10 L2
NEW java/lang/StringBuilder DUP ALOAD 1 INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String; INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V LDC " " INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; ALOAD 2 INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String; ASTORE 3
![Page 45: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/45.jpg)
@JosePaumard #50new8
String : concaténation
L’expert Java 8 écrit :
// The JDK 8 way StringJoiner sj = new StringJoiner(", ") ; sj.add("one").add("two").add("three") ; String s = sj.toString() ; System.out.println(s) ;
![Page 46: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/46.jpg)
@JosePaumard #50new8
String : concaténation
L’expert Java 8 écrit :
Ce qui écrit :
// The JDK 8 way StringJoiner sj = new StringJoiner(", ") ; sj.add("one").add("two").add("three") ; String s = sj.toString() ; System.out.println(s) ;
> one, two, three
![Page 47: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/47.jpg)
@JosePaumard #50new8
String : concaténation
L’expert Java 8 écrit :
Ce qui écrit :
// The JDK 8 way StringJoiner sj = new StringJoiner(", ") ; sj.add("one") ; String s = sj.toString() ; System.out.println(s) ;
> one
![Page 48: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/48.jpg)
@JosePaumard #50new8
String : concaténation
L’expert Java 8 écrit :
Ce qui écrit :
// The JDK 8 way StringJoiner sj = new StringJoiner(", ", "{", "}") ; sj.add("one").add("two").add("three") ; String s = sj.toString() ; System.out.println(s) ;
> {one, two, three}
![Page 49: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/49.jpg)
@JosePaumard #50new8
String : concaténation
L’expert Java 8 écrit :
Ce qui écrit :
// The JDK 8 way StringJoiner sj = new StringJoiner(", ", "{", "}") ; sj.add("one") ; String s = sj.toString() ; System.out.println(s) ;
> {one}
![Page 50: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/50.jpg)
@JosePaumard #50new8
String : concaténation
L’expert Java 8 écrit :
Ce qui écrit :
// The JDK 8 way StringJoiner sj = new StringJoiner(", ", "{", "}") ; // we dont put anything in it String s = sj.toString() ; System.out.println(s) ;
> {}
![Page 51: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/51.jpg)
@JosePaumard #50new8
String : concaténation
Et on peut presque le faire de la classe String :
Ce qui écrit :
// From the String class, with a vararg String s = String.join(", ", "one", "two", "three"); System.out.println(s);
> one, two, three
![Page 52: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/52.jpg)
@JosePaumard #50new8
String : concaténation
Et on peut presque le faire de la classe String :
Ce qui écrit :
// From the String class, with an Iterable String [] tab = {"one", "two", "three"} ; String s = String.join(", ", tab) ; System.out.println(s) ;
> one, two, three
![Page 53: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/53.jpg)
Numbers
![Page 54: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/54.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Méthodes max, min, sum
// max method available on number wrapper classes long max = Long.max(1L, 2L); long sum = Long.sum(1L, 2L);
![Page 55: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/55.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Méthodes max, min, sum
Si utile que ça ?
// max method available on number wrapper classes long max = Long.max(1L, 2L); long sum = Long.sum(1L, 2L);
![Page 56: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/56.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Méthodes max, min, sum
Si utile que ça ?
// max method available on number wrapper classes long max = Long.max(1L, 2L); long sum = Long.sum(1L, 2L);
persons.stream() .map(Person::getAge) .reduce(0, (a1, a2) -> Integer.max(a1, a2));
![Page 57: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/57.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Méthodes max, min, sum
Si utile que ça ? Utile pour écrire des method references
// max method available on number wrapper classes long max = Long.max(1L, 2L); long sum = Long.sum(1L, 2L);
persons.stream() .map(Person::getAge) .reduce(0, Integer::max);
![Page 58: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/58.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Méthodes max, min, sum
// max method available on number wrapper classes long max = Long.max(1L, 2L); long sum = Long.sum(1L, 2L);
persons.stream() .mapToInt(Person::getAge) .max();
![Page 59: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/59.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Méthodes max, min, sum
// max method available on number wrapper classes long max = Long.max(1L, 2L); long sum = Long.sum(1L, 2L);
persons.stream() .max(Comparator.comparingBy(Person::getAge));
![Page 60: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/60.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Calcul de code du hachage
// JDK 7 long l = 3141592653589793238L; int hash = new Long(l).hashCode(); // -1985256439
![Page 61: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/61.jpg)
@JosePaumard #50new8
Nombres : nouvelles méthodes
Calcul de code du hachage
// JDK 7 long l = 3141592653589793238L; int hash = new Long(l).hashCode(); // -1985256439
// JDK 8 long l = 3141592653589793238L; int hash = Long.hashCode(l); // -1985256439
![Page 62: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/62.jpg)
I/O
![Page 63: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/63.jpg)
@JosePaumard #50new8
I/O : lecture de fichiers texte
Stream étend AutoCloseable
// Java 7 : try with resources and use of Paths Path path = Paths.get("d:", "tmp", "debug.log"); try (Stream<String> stream = Files.lines(path)) { stream.filter(line -> line.contains("ERROR")) .findFirst() .ifPresent(System.out::println); } catch (IOException ioe) { // handle the exception }
![Page 64: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/64.jpg)
@JosePaumard #50new8
I/O : lecture de fichiers texte
Files.list retourne le contenu d’un répertoire
// Java 7 : try with resources and use of Paths Path path = Paths.get("c:", "windows"); try (Stream<Path> stream = Files.list(path)) { stream.filter(path -> path.toFile().isDirectory()) .forEach(System.out::println); } catch (IOException ioe) { // handle the exception }
![Page 65: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/65.jpg)
@JosePaumard #50new8
I/O : lecture d’une arborescence
Files.walk retourne le contenu d’un répertoire
// Java 7 : try with resources and use of Paths Path path = Paths.get("c:", "windows"); try (Stream<Path> stream = Files.walk(path)) { stream.filter(path -> path.toFile().isDirectory()) .forEach(System.out::println); } catch (IOException ioe) { // handle the exception }
![Page 66: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/66.jpg)
@JosePaumard #50new8
I/O : lecture d’une arborescence
Files.walk peut limiter la profondeur d’exploration
// Java 7 : try with resources and use of Paths Path path = Paths.get("c:", "windows"); try (Stream<Path> stream = Files.walk(path, 2)) { stream.filter(path -> path.toFile().isDirectory()) .forEach(System.out::println); } catch (IOException ioe) { // handle the exception }
![Page 67: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/67.jpg)
List
![Page 68: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/68.jpg)
@JosePaumard #50new8
Iterable : forEach
ForEach : permet de consommer les éléments Dommage : pas sur les tableaux
// method forEach defined on Iterable List<String> strings = Arrays.asList("one", "two", "three") ; strings.forEach(System.out::println) ;
> one, two, three
![Page 69: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/69.jpg)
@JosePaumard #50new8
Collection : removeIf
Retire un objet à partir d’un prédicat
Collection<String> strings = Arrays.asList("one", "two", "three", "four"); // works « in place », no Collections.unmodifiable... Collection<String> list = new ArrayList<>(strings); // returns true if the list has been modified boolean b = list.removeIf(s -> s.length() > 4);
> one, two, four
![Page 70: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/70.jpg)
@JosePaumard #50new8
List : replaceAll
Remplace un objet par sa transformation
List<String> strings = Arrays.asList("one", "two", "three", "four"); // works « in place », no Collections.unmodifiable... List<String> list = new ArrayList<>(strings); // returns nothing list.replaceAll(String::toUpperCase);
> ONE, TWO, THREE, FOUR
![Page 71: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/71.jpg)
@JosePaumard #50new8
List : sort
Trie une liste « en place », à l’aide d’un Comparator
List<String> strings = Arrays.asList("one", "two", "three", "four"); // works « in place », no Collections.unmodifiable... List<String> list = new ArrayList<>(strings); // returns nothing list.sort(Comparator.naturalOrder()) ;
> four, one, three, two
![Page 72: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/72.jpg)
Comparator
![Page 73: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/73.jpg)
@JosePaumard #50new8
Comparator !
Que dire de mieux ?
Comparator.naturalOrder() ;
![Page 74: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/74.jpg)
@JosePaumard #50new8
Comparator !
Que dire de mieux ?
Comparator.naturalOrder() public static <T extends Comparable<? super T>> Comparator<T> naturalOrder() { return (Comparator<T>) Comparators.NaturalOrderComparator.INSTANCE; }
![Page 75: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/75.jpg)
@JosePaumard #50new8
Comparator !
enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; // What is this??? }
![Page 76: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/76.jpg)
@JosePaumard #50new8
Comparator !
enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; // OMG: a SINGLETON!!! }
public class MySingleton { INSTANCE; private MySingleton() {} public static MySingleton getInstance() { // some buggy double-checked locking code return INSTANCE; } }
![Page 77: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/77.jpg)
@JosePaumard #50new8
Comparator !
enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; public int compare(Comparable<Object> c1, Comparable<Object> c2) { return c1.compareTo(c2); } }
![Page 78: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/78.jpg)
@JosePaumard #50new8
Comparator !
enum NaturalOrderComparator implements Comparator<Comparable<Object>> { INSTANCE; public int compare(Comparable<Object> c1, Comparable<Object> c2) { return c1.compareTo(c2); } public Comparator<Comparable<Object>> reversed() { return Comparator.reverseOrder(); } }
![Page 79: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/79.jpg)
@JosePaumard #50new8
À l’ancienne !
Comparator !
// comparison using the last name Comparator<Person> compareLastName = new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p1.getLastName().compareTo(p2.getLastName()); } };
![Page 80: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/80.jpg)
@JosePaumard #50new8
Comparator !
// comparison using the last name then the first name Comparator<Person> compareLastNameThenFirstName = new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { int lastNameComparison = p1.getLastName().compareTo(p2.getLastName()); return lastNameComparison == 0 ? p2.getFirstName().compareTo(p2.getFirstName()); lastNameComparison; } };
![Page 81: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/81.jpg)
@JosePaumard #50new8
Comparator !
À la façon du JDK 8 !
Comparator.comparingBy(Person::getLastName); // static method
![Page 82: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/82.jpg)
@JosePaumard #50new8
Comparator !
À la façon du JDK 8 !
Comparator.comparingBy(Person::getLastName) // static method .thenComparing(Person::getFirstName); // default method
![Page 83: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/83.jpg)
@JosePaumard #50new8
Comparator !
À la façon du JDK 8 !
Comparator.comparingBy(Person::getLastName) // static method .thenComparing(Person::getFirstName) // default method .thenComparing(Person::getAge);
![Page 84: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/84.jpg)
@JosePaumard #50new8
Comparator !
Vous n’aimez pas l’ordre naturel ?
Comparator<Person> comp = Comparator.naturalOrder(); Comparator<Person> reversedComp = Comparator.reversedOrder();
![Page 85: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/85.jpg)
@JosePaumard #50new8
Comparator !
Vous n’aimez pas l’ordre naturel ?
Comparator<Person> comp = Comparator.comparingBy(Person::getLastName); Comparator<Person> reversedComp = comp.reversed();
![Page 86: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/86.jpg)
@JosePaumard #50new8
Comparator !
Et que fait-on pour les valeurs nulles ?
Comparator<Person> comp = Comparator.naturalOrder();
![Page 87: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/87.jpg)
@JosePaumard #50new8
Comparator !
Et que fait-on pour les valeurs nulles ?
Comparator<Person> comp = Comparator.nullsFirst(Comparator.naturalOrder());
![Page 88: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/88.jpg)
@JosePaumard #50new8
Comparator !
Et que fait-on pour les valeurs nulles ?
Comparator<Person> comp = Comparator.nullsFirst(Comparator.naturalOrder()); Comparator<Person> comp = Comparator.nullsLast(Comparator.naturalOrder());
![Page 89: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/89.jpg)
Optional
![Page 90: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/90.jpg)
@JosePaumard #50new8
Optional
Optional a été créé pour indiquer qu’une méthode peut ne retourner « aucune valeur »
Ex : max(), min()
![Page 91: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/91.jpg)
@JosePaumard #50new8
Optional
Optional a été créé pour indiquer qu’une méthode peut ne retourner « aucune valeur »
Ex : max(), min(), average()
![Page 92: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/92.jpg)
@JosePaumard #50new8
Optional
Un Optional est un type enveloppe, qui peut être vide Comment peut-on en créer un ?
Optional<String> opt = Optional.<String>empty() ;
Optional<String> opt = Optional.of("one") ; // not null
Optional<String> opt = Optional.ofNullable(s) ; // may be null
![Page 93: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/93.jpg)
@JosePaumard #50new8
Optional
Un Optional est un type enveloppe, qui peut être vide Comment peut-on en créer un ?
Optional<String> opt = ... ; if (opt.isPresent()) { String s = opt.get() ; } else { ... }
![Page 94: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/94.jpg)
@JosePaumard #50new8
Optional
Un Optional est un type enveloppe, qui peut être vide Comment peut-on en créer un ?
String s = opt.orElse("") ; // this is a default value that // is valid for our application
Optional<String> opt = ... ; if (opt.isPresent()) { String s = opt.get() ; } else { ... }
![Page 95: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/95.jpg)
@JosePaumard #50new8
Optional
Un Optional est un type enveloppe, qui peut être vide Comment peut-on en créer un ?
String s = opt.orElseThrow(MyException::new) ; // lazy initialization
![Page 96: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/96.jpg)
@JosePaumard #50new8
Optional : patterns
Un Optional peut aussi être vu comme un Stream comportant 0 ou 1 élément
void ifPresent(Consumer<T> consumer) ;
![Page 97: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/97.jpg)
@JosePaumard #50new8
Optional : patterns
Un Optional peut aussi être vu comme un Stream comportant 0 ou 1 élément
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
![Page 98: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/98.jpg)
@JosePaumard #50new8
Optional : patterns
Un Optional peut aussi être vu comme un Stream comportant 0 ou 1 élément
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
Optional<U> map(Function<T, U> mapper) ;
![Page 99: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/99.jpg)
@JosePaumard #50new8
Optional : patterns
Un Optional peut aussi être vu comme un Stream comportant 0 ou 1 élément
void ifPresent(Consumer<T> consumer) ;
Optional<T> filter(Predicate<T> mapper) ;
Optional<U> map(Function<T, U> mapper) ;
Optional<U> flatMap(Function<T, Optional<U>> mapper) ;
![Page 100: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/100.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
public class NewMath { public static Optional<Double> inv(Double d) { return d == 0.0d ? Optional.empty() : Optional.of(1/d) ; } public static Optional<Double> sqrt(Double d) { return d < 0.0d ? Optional.empty() : Optional.of(Math.sqrt(d)) ; } }
![Page 101: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/101.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.forEach( d1 -> NewMath.inv(d1) // Optional<Double> .flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double> .ifPresent(result::add) ) ;
doubles : [-1.0, 0.0, 1.0] result : [1.0]
![Page 102: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/102.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.forEach( d1 -> NewMath.inv(d1) // Optional<Double> .flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double> .ifPresent(result::add) // Baaaaad pattern ) ;
doubles : [-1.0, 0.0, 1.0] result : [1.0]
![Page 103: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/103.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = new ArrayList<>() ; doubles.forEach( d1 -> NewMath.inv(d1) // Optional<Double> .flatMap(d2 -> NewMath.sqrt(d2)) // Optional<Double> .ifPresent(result::add) // Baaaaad pattern ) ;
doubles : [-1.0, 0.0, 1.0] result : [1.0]
![Page 104: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/104.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
Function<Double, Optional<Double>> f = d -> NewMath.inv(d) // Optional<Double> .flatMap(d -> NewMath.sqrt(d))// Optional<Double>
![Page 105: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/105.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>>
![Page 106: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/106.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double>
![Page 107: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/107.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
Function<Double, Stream<Double>> f = d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) ; // Stream<Double>
![Page 108: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/108.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; doubles.stream() .flatMap( d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double> ) // Stream<Double>
![Page 109: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/109.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = doubles.stream() .flatMap( d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double> ) // Stream<Double> .collect(Collectors.toList()) ;
![Page 110: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/110.jpg)
@JosePaumard #50new8
Optional : nouveaux patterns en vue !
List<Double> doubles = Arrays.asList(-1d, 0d, 1d) ; List<Double> result = doubles.stream().parallel() .flatMap( d -> NewMath.inv(d) // Optional<Double> .flatMap(NewMath::sqrt) // Optional<Double> .map(Stream::of) // Optional<Stream<Double>> .orElse(Stream.empty()) // Stream<Double> ) // Stream<Double> .collect(Collectors.toList()) ;
![Page 111: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/111.jpg)
Map
![Page 112: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/112.jpg)
@JosePaumard #50new8
Map : forEach
Prend un BiConsumer
// the existing map Map<String, Person> map = ... ; map.forEach( (key, value) -> System.out.println(key + " -> " + value) ) ;
![Page 113: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/113.jpg)
@JosePaumard #50new8
Map : get
Que se passe-t-il si la clé n’est pas dans la map ?
// the existing map Map<String, Person> map = ... ; Person p = map.get(key);
![Page 114: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/114.jpg)
@JosePaumard #50new8
Map : get
On peut retourner une valeur par défaut
// the existing map Map<String, Person> map = ... ; Person p = map.getOrDefault(key, Person.DEFAULT_PERSON);
![Page 115: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/115.jpg)
@JosePaumard #50new8
Map : put
Même idée pour le put
// the existing map Map<String, Person> map = ... ; map.put(key, person);
![Page 116: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/116.jpg)
@JosePaumard #50new8
Map : putIfAbsent
Même idée pour le put // the existing map Map<String, Person> map = ... ; map.put(key, person); map.putIfAbsent(key, person);
![Page 117: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/117.jpg)
@JosePaumard #50new8
Map : replace
Même idée pour le replace
// the existing map Map<String, Person> map = ... ; // key, newValue map.replace("six", john) ; // key, oldValue, newValue map.replace("six", peter, john) ;
![Page 118: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/118.jpg)
@JosePaumard #50new8
Map : replaceAll
Permet de « remapper » une map avec une l
// the existing map Map<String, Person> map = ... ; // key, oldValue map.replaceAll( (key, value) -> key + " -> " + value ; ) ;
![Page 119: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/119.jpg)
@JosePaumard #50new8
Map : remove
Efface une paire clé / valeur si elle est la
// the existing map Map<String, Person> map = ... ; // key, oldValue map.remove("six", john) ;
![Page 120: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/120.jpg)
@JosePaumard #50new8
Map : compute
Calcule une valeur à partir d’une paire clé / valeur existante, et d’une l
// the existing map Map<String, Person> map = ... ; // key, oldValue map.compute( key, (key, person) -> key + "::" + person // person can be null ) ;
![Page 121: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/121.jpg)
@JosePaumard #50new8
Map : computeIfAbsent
Calcule une valeur à partir d’une clé si elle n’est pas dans la map
// the existing map Map<String, Person> map = ... ; // key, no existing value map.computeIfAbsent( key, key -> person ) ;
![Page 122: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/122.jpg)
@JosePaumard #50new8
Map : computeIfPresent
Calcule une valeur à partir d’une paire clé / valeur présente, et d’une l
// the existing map Map<String, Person> map = ... ; // key, the existing value map.computeIfPresent( key, person, (key, person) -> newPerson // person cannot be null ) ;
![Page 123: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/123.jpg)
@JosePaumard #50new8
Map : compute*
Le truc, c’est que ces méthodes retournent la valeur, qu’elle ait été juste créée ou pas
![Page 124: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/124.jpg)
@JosePaumard #50new8
Construire des maps de maps
Construire des maps de maps devient un jeu d’enfant !
// the existing map Map<String, Map<String, Person>> map = ... ; // key, newValue map.computeIfAbsent( "one", (key) -> HashMap::new ).put("two", john);
![Page 125: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/125.jpg)
@JosePaumard #50new8
Map : merge
Calcule une nouvelle valeur à partir de la paire clé / valeur existante, d’une valeur à ajouter, et d’une l
// the existing map Map<Long, String> map = ... ; // key, otherValue map.merge( key, otherValue, (value, otherValue) -> String.join(", ", value, otherValue) ) ;
![Page 126: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/126.jpg)
Annotations
![Page 127: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/127.jpg)
@JosePaumard #50new8
Annotations en Java 7
Une annotation ne peut être posée qu’une fois Donc on crée des annotations enveloppe…
@TestCases({ @TestCase(param=1, expected=false), @TestCase(param=2, expected=true) }) public boolean even(int param) { return param % 2 == 0; }
![Page 128: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/128.jpg)
@JosePaumard #50new8
Annotations en Java 8
Avec Java 8, on peut !
@TestCase(param=1, expected=false), @TestCase(param=2, expected=true) public boolean even(int param) { return param % 2 == 0; }
![Page 129: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/129.jpg)
@JosePaumard #50new8
Comment ça marche ?
En fait, il y a un truc !
![Page 130: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/130.jpg)
@JosePaumard #50new8
Comment ça marche ?
D’abord, on crée nos annotations comme avant
@interface TestCase { int param(); boolean expected(); }
@interface TestCases { TestCase[] value(); }
![Page 131: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/131.jpg)
@JosePaumard #50new8
Comment ça marche ?
Et on ajoute @Repeatable
@Repeatable(TestCases.class) @interface TestCase { int param(); boolean expected(); }
@interface TestCases { TestCase[] value(); }
![Page 132: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/132.jpg)
@JosePaumard #50new8
Type annotations
Les annotations peuvent être posées sur les types
Exemple 1 : nous dit que persons ne peut pas être nul
private @NonNull List<Person> persons = ... ;
![Page 133: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/133.jpg)
@JosePaumard #50new8
Type annotations
Les annotations peuvent être posées sur les types
Exemple 1 : nous dit que persons ne peut pas être nul Exemple 2 : la liste ne peut contenir des valeurs nulles
private @NonNull List<Person> persons = ... ;
private @NonNull List<@NonNull Person> persons = ... ;
![Page 134: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/134.jpg)
Arrays Parallel
![Page 135: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/135.jpg)
@JosePaumard #50new8
Parallel Arrays
Arrays.parallelSetAll
long [] array = new long [...] ; Arrays.parallelSetAll(array, index -> index % 3) ; System.out.println(Arrays.toString(array)) ;
![Page 136: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/136.jpg)
@JosePaumard #50new8
Parallel Arrays
Arrays.parallelPrefix : fold right
long [] array = new long [...] ; Arrays.parallelPrefix(array, (l1, l2) -> l1 + l2) ; System.out.println(Arrays.toString(array)) ;
long [] array = {1L, 1L, 1L, 1L} ; > [1, 2, 3, 4]
![Page 137: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/137.jpg)
@JosePaumard #50new8
Parallel Arrays
Arrays.parallelSort : tri « en place »
long [] array = new long [...] ; Arrays.parallelSort(array) ; System.out.println(Arrays.toString(array)) ;
![Page 138: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/138.jpg)
Completable Future
![Page 139: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/139.jpg)
@JosePaumard #50new8
CompletableFuture
Implémente Future
CompletableFuture<String> page = CompletableFuture.supplyAsync( ) ;
![Page 140: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/140.jpg)
@JosePaumard #50new8
CompletableFuture
Implémente Future
CompletableFuture<String> page = CompletableFuture.supplyAsync( () -> readWebPage(url) // returns String ) ;
![Page 141: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/141.jpg)
@JosePaumard #50new8
CompletableFuture
On peut alors créer des pipelines
CompletableFuture.supplyAsync( () -> readWebPage(url) ) .thenApply( content -> getImages(content) // returns a List<Image> ) ; // returns a CompletableFuture<List<Image>>
![Page 142: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/142.jpg)
@JosePaumard #50new8
CompletableFuture
On peut alors créer des pipelines
CompletableFuture.supplyAsync( () -> readWebPage(url) ) .thenApply( content -> getImages(content) // returns a List<Image> ) .thenAccept( images -> images.forEach(System.out::println) );
![Page 143: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/143.jpg)
@JosePaumard #50new8
CompletableFuture
thenCompose() : permet de composer les choses
CompletableFuture.supplyAsync( () -> readWebPage(url) ) .thenCompose( content -> getImages(content) // returns List<Image> )
![Page 144: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/144.jpg)
@JosePaumard #50new8
CompletableFuture
allOf : termine quand tout les calculs sont faits (anyOf)
CompletableFuture.allOf( CompletableFuture.supplyAsync( () -> readWebPage(url) ) .thenCompose(content -> getImages(content)) .thenApply(image -> writeToDisk(image)) ) .join() ;
![Page 145: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/145.jpg)
@JosePaumard #50new8
CompletableFuture
thenCombine : combine plusieurs CF avec une l
La l est appliquée au résultat des deux CF
CompletableFuture cf1 = ... ; CompletableFuture cf2 = ... ; cf1.thenCombine(cf2, (b1, b2) -> b1 & b2) ; // can combine // the results of CFs
![Page 146: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/146.jpg)
@JosePaumard #50new8
CompletableFuture
thenCombine : combine plusieurs CF avec une l
La l est appliquée au résultat des deux CF On a aussi : thenAcceptBoth, runAfterBoth
CompletableFuture cf1 = ... ; CompletableFuture cf2 = ... ; cf1.thenCombine(cf2, (b1, b2) -> b1 & b2) ; // can combine // the results of CFs
![Page 147: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/147.jpg)
@JosePaumard #50new8
CompletableFuture
applyToEither : prend le premier résultat disponible
CompletableFuture cf1 = ... ; CompletableFuture cf2 = ... ; cf1.applyToEither(cf2, (b) -> ...) ; // applies to the first // CF that returns
![Page 148: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/148.jpg)
@JosePaumard #50new8
CompletableFuture
applyToEither : prend le premier résultat disponible acceptEither, runAfterEither
CompletableFuture cf1 = ... ; CompletableFuture cf2 = ... ; cf1.applyToEither(cf2, (b) -> ...) ; // applies to the first // CF that returns
![Page 149: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/149.jpg)
Concurrence
![Page 150: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/150.jpg)
@JosePaumard #50new8
Variables atomiques
Java 5 :
AtomicLong atomic = new AtomicLong() ; long l1 = atomic.incrementAndGet() ;
![Page 151: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/151.jpg)
@JosePaumard #50new8
Variables atomiques
Java 8 nous amène :
AtomicLong atomic = new AtomicLong() ; long l1 = atomic.incrementAndGet() ; long l2 = atomic.updateAndGet(l -> l*2 + 1) ;
![Page 152: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/152.jpg)
@JosePaumard #50new8
Variables atomiques
Java 8 nous amène :
AtomicLong atomic = new AtomicLong() ; long l1 = atomic.incrementAndGet() ; long l2 = atomic.updateAndGet(l -> l*2 + 1) ; long l3 = atomic.accumulateAndGet(12L, (l1, l2) -> l1 % l2) ;
![Page 153: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/153.jpg)
@JosePaumard #50new8
LongAdder
Java 8 nous amène :
LongAdder adder = new LongAdder() ; adder.increment() ; // in a thread adder.increment() ; // in a 2nd thread adder.increment() ; // in a 3rd thread long sum = adder.sum() ;
![Page 154: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/154.jpg)
@JosePaumard #50new8
LongAccumulator
Idem, avec une l :
LongAccumulator accu = new LongAccumulator((l1, l2) -> Long.max(l1, l2), 0L) ; accu.accumulate(value1) ; // in a thread accu.accumulate(value2) ; // in a 2nd thread accu.accumulate(value2) ; // in a 3rd thread long sum = accu.longValue() ;
![Page 155: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/155.jpg)
@JosePaumard #50new8
StampedLock
Un lock normal, avec lecture optimiste
long stamp = sl.writeLock() ; try { ... } finally { sl.unlockWrite(stamp) ; }
long stamp = sl.readLock() ; try { ... } finally { sl.unlockRead(stamp) ; }
StampedLock sl= new StampedLock() ;
![Page 156: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/156.jpg)
@JosePaumard #50new8
StampedLock
Un lock normal, avec lecture optimiste Lecture / écriture exclusives, mais…
long stamp = sl.writeLock() ; try { ... } finally { sl.unlockWrite(stamp) ; }
long stamp = sl.readLock() ; try { ... } finally { sl.unlockRead(stamp) ; }
StampedLock sl= new StampedLock() ;
![Page 157: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/157.jpg)
@JosePaumard #50new8
StampedLock
Un lock normal, avec lecture optimiste
StampedLock sl= new StampedLock() ;
long stamp = sl.tryOptimisticRead() ; // here we read a variable that can be changed in another thread if (lock.validate(stamp)) { // the read was not concurrent } else { // another thread acquired a write lock }
![Page 158: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/158.jpg)
Concurrent Concurrent
HashMap
![Page 159: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/159.jpg)
@JosePaumard #50new8
ConcurrentHashMap
La vieille ConcurrentHashMap V7 a été retirée Thread safe Pas de lock ≠ ConcurrentHashMap V7 Des nouvelles méthodes (un paquet…)
![Page 160: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/160.jpg)
@JosePaumard #50new8
ConcurrentHashMap
6000 lignes de code
![Page 161: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/161.jpg)
@JosePaumard #50new8
ConcurrentHashMap
6000 lignes de code 54 classes membre
![Page 162: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/162.jpg)
@JosePaumard #50new8
ConcurrentHashMap
6000 lignes de code 54 classes membre FYI : 58 classes dans tout java.util.concurrent
![Page 163: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/163.jpg)
@JosePaumard #50new8
ConcurrentHashMap
6000 lignes de code 54 classes membre FYI : 58 classes dans tout java.util.concurrent Nouveaux patterns !
![Page 164: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/164.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Ne jamais utiliser size()
int count = map.size() ; // should not be used count = map.mappingCount() ; // new method
![Page 165: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/165.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Ne jamais utiliser size()
int count = map.size() ; // should not be used long count = map.mappingCount() ; // new method
![Page 166: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/166.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Méthode search() search(), searchKey(), searchValue(), searchEntry() Retourne le 1er élément qui vérifie le prédicat
ConcurrentHashMap<Integer, String> map = ... ; map.search(10L, (key, value) -> value.length() < key) ;
![Page 167: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/167.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Méthode search() search(), searchKey(), searchValue(), searchEntry() Retourne le 1er élément qui vérifie le prédicat
ConcurrentHashMap<Integer, String> map = ... ; map.search(10L, (key, value) -> value.length() < key) ;
![Page 168: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/168.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Méthode search() Si la map contient plus de 10 éléments, la recherche aura
lieu en parallèle !
ConcurrentHashMap<Integer, String> map = ... ; map.search(10L, (key, value) -> value.length() < key) ;
![Page 169: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/169.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Méthode search() Si la map contient plus de 10 éléments, la recherche aura
lieu en parallèle ! On peut passer 0 ou Long.MAX_VALUE
ConcurrentHashMap<Integer, String> map = ... ; map.search(10L, (key, value) -> value.length() < key) ;
![Page 170: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/170.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Méthode forEach() forEach(), forEachKey(), forEachEntries()
ConcurrentHashMap<Integer, String> map = ... ; map.forEach(10L, (key, value) -> System.out.println(String.join(key, "->", value) ) ;
![Page 171: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/171.jpg)
@JosePaumard #50new8
ConcurrentHashMap
Méthode de réduction reduce(), reduceKey(), reduceEntries()
ConcurrentHashMap<Integer, String> map = ... ; map.reduce(10L, (key, value) -> value.getName(), // transformation (name1, name2) -> name1.length() > name2.length() ? name1 : name2) // reduction ) ;
![Page 172: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/172.jpg)
@JosePaumard #50new8
Pas de ConcurrentHashSet
Mais…
Set<String> set = ConcurrentHashMap.newKeySet() ;
![Page 173: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/173.jpg)
@JosePaumard #50new8
Pas de ConcurrentHashSet
Mais… Crée une concurrent hashmap dans laquelle les valeurs
sont Boolean.TRUE Se comporte donc comme un ConcurrentSet
Set<String> set = ConcurrentHashMap.newKeySet() ;
![Page 174: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/174.jpg)
![Page 175: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/175.jpg)
![Page 176: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/176.jpg)
Merci !
![Page 177: 50 nouvelles choses que l'on peut faire en Java 8](https://reader033.vdocuments.site/reader033/viewer/2022052908/5596087c1a28ab037c8b459f/html5/thumbnails/177.jpg)
@JosePaumard
#50new8