Vous allez finir par les aimer les Optional?

WFTPM

Qu’est-ce que c’est ?

A container object which may or may not contain a non-null value.
— docs.oracle.com

Oui mais pourquoi ?

Vision
profile jta

Jérôme

Tech Lead / Architecte / Compagnon du devoir

logo onepoint onepoint

@jtama avatar

Quand les utiliser ?

public class LeMondeExterieurConfig {

    private Optional<String> login;

    private Optional<String> password;

    private Optional<Boolean> skipLogin;
}
public interface LeMondeExterieurAccess {

     Optional<Person> findById(UUID id);

     List<Person> findByName(String name);

     Person findByNir(String nir) throws NotFoundException;
}

Oui mais qu’est-ce que j’en fait ?

raclette simple

✔️Pain de campagne, sinon baguette

private Optional<Pain> getPainDeCampagne() { /*TODO implement*/ }


Pain pain = getPainDeCampagne().orElse(baguette);

✔️Si le boucher du centre a de la charcuterie, sinon chez le boucher BEAUCOUP plus loin.

private Optional<Charcuterie> getCharcuterieDuCentre() {
    /*TODO implement*/
}

private Charcuterie getCharcuteriePlusLoin() {
    /*TODO Je sens que ça va être long.. 💀*/
}

Charcuterie = getCharcuterieDuCentre().orElse(getCharcuteriePlusLoin());










Charcuterie = getCharcuterieDuCentre()
    .orElseGet(() -> getCharcuteriePlusLoin());

✔️Fromage à raclette (ou core panic)

Fromage morbier = maybeFromage.orElseThrow(() -> new ThreadDeath());
todolist

✔️Si on trouve le prix du cadeau on le donne le prix, sinon on donne 20€.

double participation = cadeau
    .map(cadeau->cadeau.getPrix())
    .orElse(20l);

✔️Si le caviste a du Touraine, on en prend

sonar
caviste.getTouraine().ifPresent(bouteille -> onEnPrend(bouteille));

✔️Si le caviste a du Touraine ET qu’il n’est pas trop cher, on en prend.

caviste.getTouraine()
    .filter(bouteille -> pasTropCher(bouteille))
    .ifPresent(bouteille -> onEnPrend(bouteille));

✔️Si le primeur est ouvert ET qu’il a de la mangue, on prend, sinon de l’ananas.

maybePrimeur /*Optional<Primeur>*/
  .map(primeur -> primeur.getMangue());



maybePrimeur /*Optional<Primeur>*/
  .map(primeur -> primeur.getMangue()); /*Optional<Optional<Fruit>>*/



maybePrimeur /*Optional<Primeur>*/
  .flatMap(primeur -> primeur.getMangue()) /*Optional<Fruit>*/
  .orElse(new Ananas());

✔️Si je trouve les clefs dans mon sac je les utilise, sinon je passe par la fenêtre.

maybeClef
  .ifPresentOrElse(
      clef -> utilise(clef),
      () -> passeParLaFenêtre());

Et là je les utilise ?

...
if (optional.isPresent()) {
    var value = optional.get();
// NOOOOOOOOOOOOOOOOON !!!!
}
...
String code = Optional.ofNullable(app.getCodeImputationDefaut())
                .orElse(Strings.EMPTY);
String value = Optional.ofNullable(monService.getValue())
                .orElse(null);

Optional<List>

Cas à la marge

Merci \o/ !

qr

Crédits photos: Malcolm Browne, Wokandapix, Warner