Formation Java / Spring Boot pour développeurs COBOL
À l’issue de cette journée, vous sevez capable de :
throw
try/catch
filter
map
forEach
Préparer le terrain pour Spring Boot (code plus lisible, plus expressif)
Classiquement, vous utilisez :
Exemple COBOL :
PERFORM DEBIT-COMPTE IF CODE-RETOUR NOT = 0 DISPLAY "ERREUR DEBIT" GO TO FIN-PROGRAMME END-IF
Problèmes :
Découvrez les bases de la Programmation fonctionnelle & Lambdas
Découvrez comment fonctionne les Exceptions (version allégée)
Découvrez comment fonctionne les Exceptions (verion approfondie)
Démonstration
Reprendre les TP déjà réalisé et intégrer les nouveaux concepts.
En Java :
Une exception est :
throw new IllegalArgumentException("Montant invalide");
En Java, on ne teste pas systématiquement, on laisse l’erreur remonter.
try { // code à risque } catch (Exception e) { // traitement de l’erreur }
try { compte.debiter(new BigDecimal("2000")); } catch (IllegalStateException e) { System.out.println("Débit refusé : " + e.getMessage()); }
Une exception se lance là où l’erreur est détectée, pas là où elle est affichée.
if (solde < 0) { System.out.println("Erreur"); }
if (solde.compareTo(montant) < 0) { throw new IllegalStateException("Solde insuffisant"); }
NullPointerException
NumberFormatException
IOException
font partie du métier, pas de la technique.
DebitInterditException
public class DebitInterditException extends RuntimeException { public DebitInterditException(String message) { super(message); } }
Utilisation :
throw new DebitInterditException("Découvert dépassé");
Exemple :
Exception in thread "main" java.lang.IllegalStateException: Solde insuffisant at CompteEpargne.debiter(CompteEpargne.java:25) at Main.main(Main.java:10)
Lecture guidée :
Ce n’est pas un message obscur, c’est un rapport d’enquête.
Parce que :
if
Les Streams ne remplacent pas la POO, ils la rendent plus expressive.
int compteur = 0; for (Compte c : comptes) { if (c.getSolde().compareTo(BigDecimal.ZERO) < 0) { compteur++; } }
Lisible, mais :
long nbDecouverts = comptes.stream() .filter(c -> c.getSolde().compareTo(BigDecimal.ZERO) < 0) .count();
Un Stream, c’est :
Comparable à “Je prends la liste, je filtre, je compte”
comptes.stream() .filter(c -> c.getSolde().compareTo(BigDecimal.ZERO) < 0)
Equivalent à IF condition, mais exprimé une fois pour toutes.
Exemple : récupérer les soldes
comptes.stream() .map(c -> c.getSolde())
Résultat :
BigDecimal
comptes.stream() .forEach(c -> System.out.println(c.getSolde()));
forEach est une action finale. Après, le Stream est terminé.
collect
List<Compte> comptesADecouvert = comptes.stream() .filter(c -> c.getSolde().compareTo(BigDecimal.ZERO) < 0) .collect(Collectors.toList());
Transformation claire et aucun effet de bord.
On ne remplace pas tout, on choisit ce qui est plus lisible.
comptes.stream() .filter(c -> c.getSolde().compareTo(BigDecimal.ZERO) < 0) .forEach(c -> System.out.println(c.getSolde()));
List<String> numeros = comptes.stream() .filter(c -> c.getSolde().compareTo(BigDecimal.ZERO) < 0) .map(c -> c.getNumero()) .collect(Collectors.toList());
Consignes :
debiter
main
for
stream()
long nbCrediteurs = comptes.stream() .filter(c -> c.getSolde().compareTo(BigDecimal.ZERO) > 0) .count();
catch
Exception
Aujourd’hui, vous avez :
Décisions structurantes :
Vous savez maintenant :