web-dev-qa-db-fra.com

Le premier élément est associé aux expressions <liste> Java 8 facultatives

Je suis novice ici et j'essaie de me frayer un chemin à travers Java 8 flux + lambda. Quelqu'un peut-il m'aider avec le code ci-dessous? Besoin de trouver l'âge de la première personne de la liste qui est facultative. Cette liste pourrait être nulle. 

Absent du code - contrôle null pour le premier élément de la liste. Voudrais avoir ce chèque aussi. 

Quelque chose d'équivalent au morceau de code ci-dessous. 

//input parameter 
//Optional<List<Person>> persons
public Integer getAgeOfFirstPerson(Optional<List<Person>> persons) {
    if (!persons.isPresent()) {
        return null;
    }

    Integer age = persons.get()
        .get(0)
        .getAge();

    return age;
}

//Person.Java
class Person {
    Integer age;
    //getters and setters
}
3
meso

En supposant que la variable List dans votre Optional puisse être vide, vous devez également prendre en compte ce cas. Le plus simple serait donc:

return persons.flatMap(list -> list.stream().findFirst()).map(Person::getAge).orElse(null);

Malheureusement, cela ne gère pas une première entrée de liste null car findFirst() jette un NullPointerException lorsque le premier élément de Stream est null (comme Holger l’a noté dans les commentaires).

Donc, si vous voulez ignorer les entrées de la liste null et utiliser le premier élément non null, procédez comme suit:

return persons.flatMap(list -> list.stream().filter(Objects::nonNull).findFirst())
              .map(Person::getAge)
              .orElse(null);

Sinon, si vous préférez toujours la première entrée, même si elle est null, vous pouvez l'adapter comme suit:

return persons.flatMap(list -> list.stream().limit(1).filter(Objects::nonNull).findFirst())
              .map(Person::getAge)
              .orElse(null);

cependant, cela devient vraiment assez compliqué, il est donc plus simple de simplement revenir à la vérification de savoir si la liste est vide:

return persons.filter(list -> !list.isEmpty())
              .map(list -> list.get(0))
              .map(Person::getAge)
              .orElse(null);
5
Didier L

Vous pouvez utiliser Optional.map

public int getAgeOfFirstPerson(Optional<List<Person>> persons){ 
    return persons.map(people -> people.get(0).getAge()).orElse(0);
}

Notez que les primitives n'ont pas null (ce ne sont pas des objets), elles ont donc remplacé cela par 0

Ou encore amélioré en tant que répondu par @Alexey , si besoin est de vérifier si la personne est également nulle.

0
nullpointer

return null ne compilera pas si int est le type de retour. En supposant que vous vouliez un Optional<Integer> absent à la place, 

return persons.map(list -> list.get(0)).map(Person::getAge)

fonctionnera (malheureusement, il n'y a pas de mapToInt retournant OptionalInt comme pour les flux). Deux maps sont nécessaires pour gérer

Absent du code - contrôle null pour le premier élément de la liste. Voudrais avoir ce chèque aussi. 

0
Alexey Romanov