J'essaie d'appliquer le flux sur une liste qui peut être null car il appelle une méthode de référentiel et je veux en obtenir le premier élément s'il n'est pas nul et comparer l'un de ses paramètres avec la valeur de la requête.

Optional.ofNullable(placementRepository.findAllByAccountId(accountId))
            .orElseGet(Collections::emptyList)
            .stream()
            .filter(Objects::nonNull)
            .findFirst()
            .get()
            .getPlacementDate()
            .isAfter(placementRequest.getPlacementDate())

Actuellement, il échoue à .get si la liste elle-même est null alors que j'ai filtré avec nonNull. Je veux diffuser la liste si la liste n'est pas nulle et obtenir le premier élément et comparer son paramètre à une autre valeur. J'ai essayé avec d'autres filtres alternatifs mais pas de chance

1
arjun 26 janv. 2019 à 22:12

3 réponses

Étant donné que le type d'éléments de votre liste est YourPojo, cet extrait de code doit faire ce dont vous avez besoin:

List<YourPojo> list = placementRepository.findAllByAccountId(accountId); 
LocalDate date = placementRequest.getPlacementDate();

boolean flag =
    Optional.ofNullable(list)                 // Optional<List<YourPojo>>
            .flatMap(Collection::stream)      // Stream<YourPojo>
            .filter(Objects::nonNull)         // Stream<YourPojo>
            .findFirst()                      // Optional<YourPojo>
            .map(YourPojo::getPlacementDate)  // Optional<LocalDate>
            .map(d -> d.isAfter(date))        // Optional<Boolean>
            .orElse(false);                   // Boolean 

Remarque: si vous utilisez Java 11 ou supérieur, .map(d -> d.isAfter(date)) peut être remplacé par .map(not(date::isBefore)). Je ne sais pas si c'est plus lisible.

0
ETO 26 janv. 2019 à 23:36

Le fait est que .findFirst() ne peut renvoyer aucun résultat et .get() échouera. Vous pouvez utiliser .ifPresent() ou .orElseGet()

0
Nazeem 26 janv. 2019 à 19:19

Optional<T> findFirst();, donc au cas où vous auriez un flux null ou empty, alors cette méthode renvoie null.

Vous devriez utiliser .findFirst().orElseGet(() -> /* NULL object*/)

0
oleg.cherednik 26 janv. 2019 à 19:18