2. OLBATI - Geek Time - Janvier 2017 2
Nouveautés Java 8
● Introduction
● Les méthodes par defaut
● Les interfaces fonctionnelles
● Les expressions Lambda
● API Stream
● API Date
● A mentionner: Collectors, String, I/O, Optional
3. OLBATI - Geek Time - Janvier 2017 3
Introduction
● A la sortie de chaque version de java on n’a pas
constaté une grande évolution. Mais avec la version
1.8, le changement était bien remarquable avec une
orientation vers la programmation fonctionnelle. Mais,
interessons nous sur les nouveautés du java 8 en
général qui sont en relation.
4. OLBATI - Geek Time - Janvier 2017 4
Les méthodes par défaut
● Implémentation par défaut d’une méthode d’une
interface
● Pour pouvoir évoluer l’interface sans tout casser
5. OLBATI - Geek Time - Janvier 2017 5
Exemple:
interface Person {
void sayGoodBye();
default void sayHello() {
System.out.println("Hello there!");
}
}
class Test implements Person {
@Override
public void sayGoodBye() {
System.out.println("Bye there!");
}
}
6. OLBATI - Geek Time - Janvier 2017 6
Les interfaces fonctionnelles
● Connues avant sous le nom de Single Abstract
Method interface
● Interface avec une seule méthode abstraite
● Peuvent être annotées par @FunctionalInterface
● Utiles pour les expressions lambda
● Des interfaces fonctionnelles prédéfinies dans:
java.util.function
7. OLBATI - Geek Time - Janvier 2017 7
Exemples:
@FunctionalInterface
public interface Runnable {
void run();
}
public interface Person {
void sayGoodBye();
default void sayHello() {
System.out.println("Hello there!");
}
}
8. OLBATI - Geek Time - Janvier 2017 8
Expressions Lambda
● peut être assimilée à une fonction anonyme
● ayant potentiellement accès au contexte du code
appelant
● peuvent être affectées dans une interface
fonctionnelle. Le code de l’expression lambda servira
ainsi d’implémentation pour la méthode abstraite de
l’interface
● (paramètres) -> code ou (paramètres) -> {code}
9. OLBATI - Geek Time - Janvier 2017 9
Exemples:
Arrays.sort(testStrings, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return(s1.length() - s2.length());
}
});
// Forme longue :
Arrays.sort(testStrings, (String s1, String s2) -> { return s1.length() –
s2.length(); });
// Forme courte (possible uniquement s’il n’y a qu’une instruction) :
Arrays.sort(testStrings, (String s1, String s2) -> s1.length() –
s2.length());
// Forme courte avec type implicite des paramètres
// (le type est déduit par le compilateur via l’inférence)
Arrays.sort(testStrings, (s1, s2) -> s1.length() – s2.length());
10. OLBATI - Geek Time - Janvier 2017 10
API Stream
● un flux de données que l'on peut manipuler à la volée
● peut être en mode séquentiel ou parallèle
● source de données peut être très variée (un tableau,
une collection, I/O…)
● des opérations intermédiaires (filtrer, transformer,
trier...)
● une opération terminale (recupération de résultat ou
opération spécifique)
11. OLBATI - Geek Time - Janvier 2017 11
Exemple:
Stream<Integer> number = Stream.of(1, 2, 3, 4, 5);
List<Integer> result2 = number.filter(x ->
x!=3).collect(Collectors.toList());
result2.parallelStream().forEach(x -> System.out.println(x));
12. OLBATI - Geek Time - Janvier 2017 12
Exemple:
String fileName = "/tmp/lines.txt";
List<String> list = new ArrayList<>();
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
list = stream
.filter(line -> !line.startsWith("line3"))
.map(String::toUpperCase)
.collect(Collectors.toList());
} catch (IOException e) {
e.printStackTrace();
}
13. OLBATI - Geek Time - Janvier 2017 13
API Date
● Toutes les classes centrales de l'API Date and Time
sont immuables
● Les méthodes chaînables rendent le code plus lisible
et elles sont aussi plus simples
● temps machine: java.time.Instant et
java.time.Duration
● Les classes java.time.LocalDate, java.time.LocalTime
et java.time.LocalDateTime représentent des dates et
heures système sans indication du fuseau horaire.
● ZoneId, ZoneOffset, ZonedDateTime, et OffsetDateTime
14. OLBATI - Geek Time - Janvier 2017 14
Exemples:
Assert.assertEquals("1970-01-01T00:00:00Z", Instant.EPOCH.toString());
final Instant instant = Instant.now();
Assert.assertTrue(localTime.isAfter(localTime2));
Assert.assertFalse(localTime.isBefore(localTime2));
Assert.assertEquals("12:25:25.45236",
localTime.minusMinutes(10).toString());
Assert.assertEquals("17:35:25.452367943",
localTime.plusHours(5).toString());
15. OLBATI - Geek Time - Janvier 2017 15
Autres nouveautés
● StringJoiner
● String.join
● Collectors
● Optional
16. OLBATI - Geek Time - Janvier 2017 16
Autres:
StringJoiner sj = new StringJoiner("/", "prefix-", "-suffix");
sj.add("2016");
sj.add("02");
sj.add("26");
String result = sj.toString(); //prefix-2016/02/26-suffix
List<String> list = Arrays.asList("java", "python", "nodejs", "ruby");
//java, python, nodejs, ruby
String result = String.join(", ", list);
//java | python | nodejs | ruby
String result = list.stream().map(x -> x).collect(Collectors.joining(" |
"));
Optional optionalCar = Optional.empty();
price = optionalCar.orElse( defaultCar ).getPrice();
17. OLBATI - Geek Time - Janvier 2017 17
Thanks!
Any questions?
abdelhakim.wahab@olbati.com