Adloun

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 une IllegalStateException. 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 un Optional vide lève une NoSuchElementException. 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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →