Spring Boot中LocalDate转String时Stream不存在format方法报错
报错原因
执行代码抛出Cannot resolve method 'format' in 'Stream'的根本原因是:datesRequests.stream().map(DatesRequest::getStartDate)的返回值是Stream<LocalDate>流对象,Stream类本身没有定义format方法,自然无法直接调用。format方法是定义在LocalDate类上的,你需要先拿到流里具体的LocalDate实例,再对单个日期对象做格式化,不能直接在流对象上调用。另外你当前的流可能包含多个请假日期,也不能直接把整个流的结果当成单个字符串赋值给变量。
修复代码
根据你的业务场景二选一即可:
- 场景1:业务上
datesRequests只会有1条数据,只需要取单个请假开始日期
先从流中取出第一个LocalDate实例,再调用format方法做格式化,同时做好空值兜底避免空指针:// 提前定义日期格式化器,避免重复创建实例 private static final DateTimeFormatter LEAVE_DATE_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); List<DatesRequest> datesRequests = PaidRequest.getDatesRequest(); // 取出单个日期格式化,空列表时默认返回空字符串 String startDate = datesRequests.stream() .map(DatesRequest::getStartDate) .findFirst() .map(date -> date.format(LEAVE_DATE_FORMATTER)) .orElse(""); CollaboratorDTO validator = OrganizationalUintService.findValidator(collaboratorTransformer.entityTranferToDTO(PaidRequest.getCollaborator())); EmailService.sendSimpleMessage(validator.getEmail(), "EverHoliday", " Bonjour "+validator.getFirstname()+" "+validator.getLastname()+",\n" + "\n"+ PaidRequest.getCollaborator().getLastname()+" " +PaidRequest.getCollaborator().getFirstname()+ " a ajouté une demande de congé du "+startDate+ " en attente de votre approbation \n" + "\n Cordialement."); - 场景2:业务上
datesRequests可能有多条数据,需要把所有请假日期都拼接进邮件
先对流里的每个LocalDate单独做格式化,再把格式化后的日期字符串拼接成完整字符串:private static final DateTimeFormatter LEAVE_DATE_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); List<DatesRequest> datesRequests = PaidRequest.getDatesRequest(); // 所有日期格式化后用逗号分隔拼接,空列表时默认返回空字符串 String startDate = datesRequests.stream() .map(DatesRequest::getStartDate) .map(date -> date.format(LEAVE_DATE_FORMATTER)) .collect(Collectors.joining(", ")); // 后续邮件发送逻辑和上面一致
额外提示:你原代码里的邮件正文字符串直接在代码中断行,会触发Java编译错误,Java字符串内的换行需要用
\n转义字符实现,上面的修复代码已经同步修正了这个问题。另外Java变量命名推荐用小驼峰格式,StartDate建议改成startDate,符合通用编码规范。
内容的提问来源于stack exchange,提问作者Nouhaila Khaouti
相关产品推荐
相关产品推荐

