如何使用Streams累加近两年Ticket嵌套集合中的penalty points值
解决方案
你已经完成了日期筛选的步骤,接下来只需要通过flatMap把每个TicketDTO里的Offences集合拆成单个OffenceDTO的流,再提取扣分并累加即可,完整代码如下:
int totalPenaltyPoints = tickets().stream() // 筛选近两年的罚单 .filter(ticket -> isDateBetween(LocalDate.now(), ticket.getDate())) // 将每个罚单的违规集合拆成单个违规的流 .flatMap(ticket -> ticket.getOffences().stream()) // 提取每个违规的扣分 .mapToInt(OffenceDTO::getPenaltyPoints) // 累加所有扣分 .sum();
代码说明:
flatMap(...):把每个TicketDTO对应的Set<OffenceDTO>转换成流,将所有嵌套流合并为单个包含所有OffenceDTO的流,实现集合"扁平化"。mapToInt(...):将每个OffenceDTO映射为对应的扣分数值,得到整数流IntStream。sum():对整数流中的所有值求和,直接得到总扣分。
如果你需要保留筛选后的罚单列表再统计,也可以拆分两步写:
// 先收集近两年的罚单列表 List<TicketDTO> recentTickets = tickets().stream() .filter(ticket -> isDateBetween(LocalDate.now(), ticket.getDate())) .collect(Collectors.toList()); // 统计总扣分 int totalPenaltyPoints = recentTickets.stream() .flatMap(ticket -> ticket.getOffences().stream()) .mapToInt(OffenceDTO::getPenaltyPoints) .sum();
两种写法效果一致,可根据是否需要保留中间列表选择。
内容的提问来源于stack exchange,提问作者Lulex97
相关产品推荐
相关产品推荐

