web-dev-qa-db-fra.com

Comment renvoyer une seule chaîne du flux Java

Je comprends comment collecter une valeur List, mais je ne peux pas comprendre. Comment puis-je renvoyer un seul paramètre d'objet filtré sous la forme String.

fee = new BigDecimal(fees
            .stream()
            .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
            .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
            .filter(p -> p.getId().equals(id))

    return fee;

Je vérifie d'abord que les frais sont à jour, car il pourrait y avoir des frais à venir et des frais qui ne sont plus valables. Ensuite, je fais correspondre l'identifiant avec les frais restants . Mais il manque alors du code entre le dernier filtre et le retour.

Je veux juste renvoyer String à partir de l'objet Stream (p.getFee) pour le constructeur BigDecimal.

Je sais qu'il ne reste qu'un objet Stream après les filtres.

9
Clomez

Utilisez findFirst pour renvoyer le premier élément de la Stream qui transmet vos filtres. Il retourne une Optional. Vous pouvez donc utiliser orElse() pour définir une valeur par défaut au cas où Stream serait vide.

fee = new BigDecimal(fees
            .stream()
            .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
            .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
            .filter(p -> p.getId().equals(id))
            .map(p -> p.getFee())
            .findFirst()
            .orElse(/*some default value*/));
11
Eran

Ce serait peut-être une meilleure approche:

fee = fees.stream()
        .filter(p -> p.getTodate().isAfter(LocalDateTime.now()))
        .filter(p -> p.getFromdate().isBefore(LocalDateTime.now()))
        .filter(p -> p.getId().equals(id))
        .map(p -> p.getFee())
        .findFirst()
        .map(BigDecimal::new)
        .orElse(/*some default value*/);
1
Piotr Rzonsowski