2 votes

Comment additionner les valeurs d'une collection imbriquée à l'aide de Streams

J'ai les éléments suivants TicketDTO Objet :

public class TicketDTO {
    private LocalDate date;
    private Set<OffenceDTO> offences;
}

Et chaque OffenceDTO a un int champ - points de pénalité .

public class OffenceDTO {
    private int penaltyPoints;
}

Je voudrais additionner les points de pénalité à un seul int en diffusant la valeur Ensemble des infractions de chaque Ticket . Mais seulement si la date du billet se situe entre les deux dernières années.

J'ai collecté les contraventions des deux dernières années, mais j'ai maintenant un problème pour passer en revue les infractions et compter leurs points.

Voici ce que j'ai écrit jusqu'à présent :

tickets().stream()
    .filter(ticketEntity -> isDateBetween(LocalDate.now(), ticketEntity.getDate()))
    .collect(Collectors.toList());

3voto

Dan Points 1

En supposant que tickets() est une méthode qui renvoie un List de TicketDTO vous pouvez diffuser le List et filtrer ses éléments avec votre méthode personnalisée isDateBetween (comme vous le faisiez).

Puis à plat la correspondance de chaque contravention avec les infractions correspondantes . Cela vous fournira un flux de OffenceDTO dont TicketDTO se situe entre les deux dernières années (selon votre isDateBetween méthode).

Au final, vous pouvez collecter les points de chaque OffenceDTO en les additionnant avec le summingInt de la méthode Collectors classe.

int res = tickets().stream()
        .filter(ticketEntity -> isDateBetween(LocalDate.now(), ticketEntity.getDate()))
        .flatMap(ticketDTO -> ticketDTO.getOffences().stream())
        .collect(Collectors.summingInt(OffenceDTO::getPenaltyPoints));

3voto

Je voudrais collecter les points de pénalité dans un seul int en diffusant la valeur série de billets

Cela peut être fait en suivant les étapes suivantes :

  • Tourner le flux de filtrage billets en un flux de OffenceDTO en utilisant flatMap() ;
  • Extrait points de pénalité de OffenceDTO avec mapToInt() qui transformera un flux d'objets en un flux de données. IntStream ;
  • Appliquer sum() pour obtenir le total.

    int totalPenalty = tickets().stream() .filter(ticketEntity -> isDateBetween(LocalDate.now(), ticketEntity.getDate())) .flatMap(ticketDTO -> ticketDTO.getOffences().stream()) .mapToInt(OffenceDTO::getPenaltyPoints) .sum();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X