3
votes

Java Facultatif orElseThrow avec collection vide

J'implémente un flux dans lequel j'utilise une collection listOfFoo pour obtenir les identifiants de tous les éléments de cette liste et les utiliser pour obtenir les valeurs des instances Bar.

Je voudrais m'assurer que cette méthode lèvera ResourceNotFoundException au cas où il n'y aurait pas d'éléments sur la liste des barres, bien que dans l'état actuel, elle vérifie si les barres de la liste sont nulles et non, car elles contient une liste vide.

Pourriez-vous s'il vous plaît m'aider et suggérer une solution?

List<Bar> bars = Optional.ofNullable(
           listOfFoos.stream()
           .map(Foo::getId)                                         
           .map(fooId -> service.getBars(fooId))                                            
       .filter(Objects::nonNull)
       .collect(Collectors.toList()))                            
       .orElseThrow(() -> new ResourceNotFoundException(Bar.class, OBJECT_NULL));


0 commentaires

3 Réponses :


3
votes

Ajoutez simplement un Optional.filter pour cela alors. Vous pouvez le faire comme:

List<Bar> bars = Optional.ofNullable(
        listOfFoos.stream().map(fooId -> service.getBars(fooId))
                .filter(Objects::nonNull).collect(Collectors.toList()))
        .filter(a -> !a.isEmpty())
        .orElseThrow(() -> new ResourceNotFoundException(Bar.class, OBJECT_NULL));

À part: Par l'implémentation partagée dans le code, la liste renvoyée par le flux ne peut pas être null , donc Facultatif .ofNullable pourrait éventuellement être remplacé par Optional.of.


0 commentaires

8
votes

Je ne vois pas vraiment l'intérêt d'utiliser Facultatif , ce serait plus lisible sans lui:

List<Bar> bars = listOfFoos.stream()
   .map(Foo::getId)       
   .map(service::getBars)                    
   .collect(Collectors.toList());

if (bars.isEmpty()) {
   throw new ResourceNotFoundException(Bar.class, OBJECT_NULL);
}


0 commentaires

2
votes

Le livre Effective Java mentionne ce qui suit:

Les types de conteneurs, y compris les collections, les cartes, les flux, les tableaux et Les options ne doivent pas être enveloppées dans des options. (P.252)


0 commentaires