示例代码如下:

List<CustomerReceivablesAnalysisReportRespVO> result = new ArrayList<>();
List<CustomerReceivablesAnalysisReportRespVO> customerAcceptance = customerBalanceStatementMapper.getCustomerAcceptance(report);
List<CustomerReceivablesAnalysisReportRespVO> saleReceivables = customerBalanceStatementMapper.getSaleReceivables(report);
result.addAll(customerAcceptance);
result.addAll(saleReceivables);
if (report.getOrderType() != null && !report.getOrderType().equals("null")) {
    result = result.stream().filter(item -> item.getOrderType().equals(report.getOrderType()))
    .toList();
}

// 根据业务时间排序
       result.sort(Comparator.comparing(CustomerReceivablesAnalysisReportRespVO::getBusinessDate));

问题背景:构建完这个集合,在运行时,对这个集合进行根据业务时间排序的时候报了UnsupportedOperationException

问题原因:Stream.toList()(Java 16+)返回的是 不可变列表(类似 List.of()),而后续代码可能尝试修改该列表(如 sort()add()remove()),导致抛出 UnsupportedOperationException。问题代码就是过滤呢一段!!!

解决方案:

result = result.stream()
        .filter(item -> item.getOrderType().equals(report.getOrderType()))
        .collect(Collectors.toCollection(ArrayList::new)); // 明确返回 ArrayList
result = result.stream()
         .filter(item -> item.getOrderType().equals(report.getOrderType()))
         .collect(Collectors.toList());

这两种方式都能解决。

总结:

  • 问题本质:对 Stream.toList() 的返回值行为理解不足,导致后续操作失败。
  • 解决方案:优先使用 Collectors.toCollection(ArrayList::new) 确保可变列表,或根据 Java 版本选择兼容方案。
  • 预防措施:熟悉 Java 新特性的行为变化,避免隐式假设 API 行为。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐