Introduction aux Nouvelles Fonctionnalités de Java 8
Java 8 a introduit des changements majeurs dans la programmation Java, notamment avec le support de la programmation fonctionnelle, de nouvelles API pour les dates et les flux, et des améliorations pour la concurrence. Ce guide explore les fonctionnalités clés avec des exemples pratiques.
Expressions Lambda et Interfaces Fonctionnelles
Les expressions Lambda permettent d'implémenter des interfaces foncsionnelles de manière concise. Une interface fonctionnelle ne contient qu'une seule méthode abstraite.
// Exemple d'interface fonctionnelle
@FunctionalInterface
interface Transformation {
Integer appliquer(String entrée);
}
// Utilisation d'une Lambda
Transformation longueur = texte -> texte.length();
System.out.println(longueur.appliquer("Bonjour")); // Affiche 7
Références de Méthodes et de Constructeurs
Les références de méthodes offrent une syntaxe plus compacte pour les expressions Lambda simples. Elles peuvent être utilisées avec des instances, des méthodes statiques ou des constructeurs.
// Référence de méthode statique
Function<string integer=""> convertirEntier = Integer::parseInt;
System.out.println(convertirEntier.apply("42")); // Affiche 42
// Référence de constructeur
Supplier<list>> listeFactory = ArrayList::new;
List<string> nouvelleListe = listeFactory.get();
</string></list></string>
API Stream pour le Traitement des Collections
L'API Stream permet de traiter les collections de manière déclarative avec des opérations comme le filtrage, le mappage et la réduction.
List<string> noms = Arrays.asList("Alice", "Bob", "Charlie", "David");
// Filtrer et collecter
List<string> nomsFiltrés = noms.stream()
.filter(nom -> nom.length() > 3)
.collect(Collectors.toList());
// Réduire pour obtenir une concaténation
String concaténation = noms.stream()
.reduce("", (acc, nom) -> acc.isEmpty() ? nom : acc + ", " + nom);
System.out.println(concaténation); // Affiche Alice, Bob, Charlie, David
</string></string>
Classe Optional pour Éviter les NullPointerExceptions
Optional encapsule une valeur qui peut être nulle, encourageant un code plus robuste.
Optional<string> optionnel = Optional.ofNullable(null);
String résultat = optionnel.orElse("Valeur par défaut");
System.out.println(résultat); // Affiche Valeur par défaut
// Chaînage avec map
Optional<integer> longueur = Optional.of("Test").map(String::length);
longueur.ifPresent(v -> System.out.println(v)); // Affiche 4
</integer></string>
Nouvelles API de Date et d'Heure
L'API java.time remplace les anciennes classes Date et Calendar avec des objets immuables et thread-safe.
LocalDate aujourd = LocalDate.now();
LocalTime maintenant = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.of(aujourd, maintenant);
// Formatage
DateTimeFormatter formateur = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
String formaté = dateTime.format(formateur);
System.out.println(formaté);
// Calcul de durée
LocalDate anniversaire = LocalDate.of(1990, Month.JANUARY, 1);
Period période = Period.between(anniversaire, aujourd);
System.out.println("Âge : " + période.getYears() + " ans");
Méthodes par Défaut et Statiques dans les Interfaces
Les interfaces peuvent désormais inclure des méthodes avec des implémentations par défaut, permettant l'évolution des API sans casser le code existant.
interface Démo {
default void saluer() {
System.out.println("Bonjour par défaut");
}
static void message() {
System.out.println("Méthode statique de l'interface");
}
}
class Implémentation implements Démo {}
Implémentation démo = new Implémentation();
démo.saluer(); // Appelle la méthode par défaut
Démo.message(); // Appelle la méthode statique
CompletableFuture pour la Programmation Asynchrone
CompletableFuture améliore la gestion des tâches asynchrones avec des mécanismes de cmoposition et de gestion d'erreurs.
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> {
// Simulation d'une tâche longue
try { Thread.sleep(1000); } catch (InterruptedException e) {}
return "Résultat asynchrone";
});
future.thenAccept(résultat -> System.out.println(résultat))
.exceptionally(ex -> {
System.out.println("Erreur : " + ex.getMessage());
return null;
});
</string>
Améliorations Diverses
Java 8 inclut également des optimisations comme le remplacement des listes chaînées par des arbres rouges-noirs dans HashMap pour de meilleures performances, et le support de l'encodage Base64 dans la bibliothèque standard.
// Encodage Base64
String texte = "Exemple de texte";
String encodé = Base64.getEncoder().encodeToString(texte.getBytes());
String décodé = new String(Base64.getDecoder().decode(encodé));