You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:39:05