BeanMapping映射表达式中能否替换Set内的指定元素值?
问题解答
可以直接在@Mapping的映射表达式中实现该替换需求,不需要修改原有通用转换逻辑,以下是两种可直接落地的实现方式:
方式1:直接在表达式内完成值替换
在原有转换逻辑的返回结果基础上,直接通过流处理完成集合元素的判断替换即可。注意注解内的Java字符串需要对双引号做转义,如果没有提前导入Stream、Collectors相关类,需要写全类名避免编译报错:
@Mapping(target = "targetFieldName", expression = "java(java.util.stream.Stream.ofNullable(contentMapperService.convertStringToSet(pdfFieldsMap.get(\"PDF_field_name\")))" + ".flatMap(java.util.Set::stream)" + ".map(item -> \"apple\".equals(item) ? \"apples\" : item)" + ".collect(java.util.stream.Collectors.toSet()))")
如果不想写全限定类名,可以在Mapper接口的@Mapper注解中通过imports属性提前导入依赖类:
// 提前导入需要用到的工具类 @Mapper(imports = {Stream.class, Collectors.class}, uses = ContentMapperService.class) public interface PdfFormConvertMapper { @Mapping(target = "targetFieldName", expression = "java(Stream.ofNullable(contentMapperService.convertStringToSet(pdfFieldsMap.get(\"PDF_field_name\")))" + ".flatMap(Set::stream)" + ".map(item -> \"apple\".equals(item) ? \"apples\" : item)" + ".collect(Collectors.toSet()))") TargetEntity convert(Map<String, String> pdfFieldsMap); }
方式2:封装专用转换方法简化表达式
如果觉得直接在表达式里写流逻辑太长可读性差,或者后续其他映射场景也需要用到同类替换逻辑,可以直接在contentMapperService中新增带替换逻辑的重载方法,映射表达式直接调用新方法即可:
// 在ContentMapperService中新增封装了替换逻辑的转换方法 public Set<String> convertStringToSetWithAppleReplace(String rawPdfValue) { Set<String> originSet = convertStringToSet(rawPdfValue); // 移除旧值、添加替换后的值,无需额外判断元素是否存在 if (originSet.remove("apple")) { originSet.add("apples"); } return originSet; } // 映射配置可简化为直接调用新方法 @Mapping(target = "targetFieldName", expression = "java(contentMapperService.convertStringToSetWithAppleReplace(pdfFieldsMap.get(\"PDF_field_name\")))")
提示:如果替换规则后续可能调整(比如新增更多值的映射关系),优先选择第二种封装方法的方式,后续维护不需要改动Mapper注解配置,只需要调整Service里的转换逻辑即可。
内容的提问来源于stack exchange,提问作者trypophobe
相关产品推荐
相关产品推荐

