Astuce Java : orElse() vs orElseGet() - Éviter le piège des Optional
Voici un piège courant avec les Optional en Java. À partir d'une liste de rôles, nous voulons récupérer "Admin" en priorité, sinon "User" par défaut.
Pourquoi le premier code pose problème ?
Même si "ADMIN" est trouvé dans la liste, le code dans orElse() est toujours exécuté. Cela signifie que :
• Le second stream() est créé inutilement
• Le filter() pour "USER" s'exécute même si ce n'est pas nécessaire
• L'exception IllegalStateException sera levée car "USER" n'existe pas dans la liste
Pourquoi la solution fonctionne ?
Avec orElseGet(), l'expression lambda n'est évaluée que si l'Optional est vide. Si "ADMIN" est trouvé, le code de fallback ne s'exécute jamais.
Règle à retenir :
✅ orElse(value) : La valeur est toujours évaluée, même si elle n'est pas utilisée
✅ orElseGet(() -> value) : La valeur n'est évaluée que si l'Optional est vide
Utilisez orElseGet() quand :
• Le calcul de la valeur par défaut est coûteux
• Le code peut lever des exceptions
• Vous voulez éviter des effets de bord inutiles
Vous pouvez utiliser orElse() quand :
• La valeur par défaut est une constante simple (orElse("inconnu"))
• Le calcul est très léger et sans effet de bord
#Java #JavaDevelopment #Programming #Optional #StreamAPI #BestPractices #CleanCode #JavaTips #SoftwareDevelopment #Coding #JavaProgramming #CodeReview #TechTips #DeveloperLife #JavaBestPractices
C'est l'une des erreurs les plus problématiques (surtout sur des traitements fonctionnels).
Car les TU peuvent passer (en mode black box, sans verify not used ou pratiques du genre) et pourtant le code ne fait pas ce qu'il faut !
La Code Review est vraiment importante à ce niveau 😉
Ce qu'il faut garder en tête : Java est pass-by-value.