Java迭代时使用不同Setter消除MultipartFile存储重复代码的实现方法
问题核心原因
你现有写法的问题是Map仅存储了文件和目录的对应关系,没有绑定每个文件对应的Setter方法,自然无法在迭代时匹配调用。Java迭代时完全可以使用不同的Setter方法,只要将Setter作为关联属性和对应文件、目录一起存储即可。
最优实现方案(推荐)
优先使用List存储封装好的三元组(文件、目录、对应Setter),避免使用Map时MultipartFile作为key重复覆盖导致丢数据的问题:
1. 定义存储元数据的封装类
如果使用Java 16及以上版本,可直接用record简化代码:
// 泛型T对应Setter的入参类型,和store方法返回的存储路径类型保持一致即可 record FileStoreMeta<T>(MultipartFile file, String directory, java.util.function.Consumer<T> setter) {}
Java 16以下版本定义普通POJO即可:
public class FileStoreMeta<T> { private MultipartFile file; private String directory; private java.util.function.Consumer<T> setter; public FileStoreMeta(MultipartFile file, String directory, java.util.function.Consumer<T> setter) { this.file = file; this.directory = directory; this.setter = setter; } // 生成三个属性的getter方法 public MultipartFile getFile() { return file; } public String getDirectory() { return directory; } public java.util.function.Consumer<T> getSetter() { return setter; } }
2. 构造元数据列表并迭代调用
// 假设store方法返回的存储路径是String类型,泛型填String即可 List<FileStoreMeta<String>> storeMetaList = List.of( new FileStoreMeta<>(dogfile, dogDirectory, vetDTO::setDog), new FileStoreMeta<>(catFile, catDirectory, vetDTO::setCat), new FileStoreMeta<>(lionFile, lionDirectory, vetDTO::setLion), new FileStoreMeta<>(bugFile, bugDirectory, vetDTO::setBug), new FileStoreMeta<>(mouseFile, mouseDirectory, vetDTO::setMouse), new FileStoreMeta<>(bunnyFile, bunnyDirectory, vetDTO::setBunny) ); // 迭代调用store方法 storeMetaList.forEach(meta -> store(meta.file(), meta.directory(), meta.setter())); // Java 16以下用getter:store(meta.getFile(), meta.getDirectory(), meta.getSetter());
可选方案(基于Map实现)
如果你坚持使用Map,可将Value改为目录和Setter的组合类:
Map<MultipartFile, Map.Entry<String, java.util.function.Consumer<String>>> filesToStore = new HashMap<>(); filesToStore.put(dogfile, new AbstractMap.SimpleEntry<>(dogDirectory, vetDTO::setDog)); filesToStore.put(catFile, new AbstractMap.SimpleEntry<>(catDirectory, vetDTO::setCat)); // 其他文件同理添加 // 迭代调用 filesToStore.forEach((file, entry) -> store(file, entry.getKey(), entry.getValue()));
内容的提问来源于stack exchange,提问作者user16807416
相关产品推荐
相关产品推荐

