- Utiliser les streams pour filtrer et transformer des collections.
- Manipuler des
Optional
pour gérer les champs facultatifs. - Pratiquer des chaînes d’opérations fonctionnelles claires et robustes.
Vous développez un petit moteur de recherche pour un gestionnaire de contacts.
Chaque contact est représenté par la classe suivante :
public class Contact {
private String id;
private Optional<String> firstName;
private Optional<String> lastName;
private Optional<String> email;
private Optional<String> phoneNumber;
private Optional<String> city;
// constructor, etc.
}
List<Contact> contacts = List.of(
new Contact("1", Optional.of("Alice"), Optional.of("Durand"), Optional.of("[email protected]"), Optional.of("0102030405"), Optional.of("Paris")),
new Contact("2", Optional.empty(), Optional.of("Martin"), Optional.empty(), Optional.of("0607080910"), Optional.of("Lyon")),
new Contact("3", Optional.of("Bob"), Optional.empty(), Optional.of("[email protected]"), Optional.empty(), Optional.empty()),
// ...
);
Implémentez :
List<Contact> searchByName(List<Contact> contacts, String query)
Elle retourne les contacts dont le prénom ou nom contient la chaîne query
(insensible à la casse).
- Filtrer uniquement les
Optional
présents - Utiliser
Stream.filter
,map
,flatMap
- Ne pas provoquer de
NoSuchElementException
Implémentez :
List<String> exportToCsv(List<Contact> contacts)
Chaque ligne de CSV est du type :
"Durand,Alice,[email protected],0600000000,Toulouse"
Si une info est absente, laisser vide. Exemple :
"Martin,,,0700000000,"