programmation Java (école d'ingénieur) · Chapitre 13 · Application directe du cours
Trois erreurs
Lambdas et streams · niveau 2
Énoncé
Chacun des fragments suivants est fautif. Dire si l'erreur se produit à la compilation ou à l'exécution, l'expliquer, et proposer une correction.
-
int compte = 0;
mots.forEach(m -> { if (m.length() > 3) compte++; });
-
Stream<String> s = mots.stream().filter(m -> m.length() > 3);
long n = s.count();
List<String> l = s.collect(Collectors.toList());
-
String premier = mots.stream().filter(m -> m.startsWith("z")).findFirst().get();Corrigé
- Compilation : la lambda modifie la variable locale
compte, qui n'est donc pas effectivement finale (« local variables referenced from a lambda expression must be final or effectively final »). Correction :
long compte = mots.stream().filter(m -> m.length() > 3).count();
- Exécution :
s.count()est une opération terminale qui épuise le stream ;s.collect(...)lève uneIllegalStateException. Correction : construire d'abord la liste, puis prendre sa taille :
List<String> l = mots.stream().filter(m -> m.length() > 3)
.collect(Collectors.toList());
long n = l.size();
- Exécution, seulement si aucun mot ne commence par
z:get()sur unOptionalvide lève uneNoSuchElementException. Correction :
String premier = mots.stream().filter(m -> m.startsWith("z")).findFirst()
.orElse("aucun");
ou bien ifPresent(...). C'est le piège le plus dangereux des trois : le programme marche sur les essais où un tel mot existe.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.