首页 > 解决方案 > 在 Java 中迭代时设置不同的值

问题描述

我正在开发一个应用程序,我必须在其中存储不同的 MultipartFile 文件(jpgs、pngs 等),并试图改进这个重复的代码:

store(dogfile, dogDirectory, vetDTO::setDog);
store(catFile, catDirectory, vetDTO::setCat);
store(lionFile, lionDirectory, vetDTO::setLion);
store(bugFile, bugDirectory, vetDTO::setBug); 
store(mouseFile, mouseDirectory, vetDTO::setMouse); 
store(bunnyFile, bunnyDirectory, vetDTO::setBunny); 

我尝试将每个文件和目录存储在这样的 Map 中:

Map<MultipartFile, String> filesToStore = new HashMap<MultipartFile, String>();
filesToStore.put(dogfile, dogDirectory);
filesToStore.put(catFile, catDirectory);
filesToStore.put(lionFile, lionDirectory);
filesToStore.put(bugFile, bugDirectory);
filesToStore.put(bunnyFile, bunnyDirectory);
filesToStore.forEach((f,d) -> store(f, d, vetDTO::set...));

但是最后一行给了我一个错误,因为我无法在迭代时使用每个 setter,而且我真的很困惑如何实现这一点。

迭代时是否可以使用不同的设置器?

标签: java

解决方案


目前尚不清楚您的可编译代码是什么,但我可以给您一个提示。

您可以使用简单的循环删除重复项:

Main context = new Main();
VetDTO vetDTO = new VetDTO();

for (Animal animal : Animal.values())
    animal.store(context, vetDTO);

为此,您必须将与特定动物相关的代码封装在一个单独的类中。

public class Main {

    private MultipartFile dogFile;
    private MultipartFile catFile;
    private MultipartFile lionFile;
    private MultipartFile bugFile;
    private MultipartFile mouseFile;
    private MultipartFile bunnyFile;

    private String dogDirectory;
    private String catDirectory;
    private String lionDirectory;
    private String bugDirectory;
    private String mouseDirectory;
    private String bunnyDirectory;

    enum Animal {
        DOG(context -> context.dogFile, context -> context.dogDirectory, (directory, vetDTO) -> vetDTO.setDog(directory)),
        CAT(context -> context.catFile, context -> context.catDirectory, (directory, vetDTO) -> vetDTO.setCat(directory)),
        LION(context -> context.lionFile, context -> context.lionDirectory, (directory, vetDTO) -> vetDTO.setLion(directory)),
        BUG(context -> context.bugFile, context -> context.bugDirectory, (directory, vetDTO) -> vetDTO.setBug(directory)),
        MOUSE(context -> context.mouseFile, context -> context.mouseDirectory, (directory, vetDTO) -> vetDTO.setMouse(directory)),
        BUNNY(context -> context.bunnyFile, context -> context.bunnyDirectory, (directory, vetDTO) -> vetDTO.setBunny(directory));

        private final Function<Main, MultipartFile> getMultipartFile;
        private final Function<Main, String> getDirectory;
        private final BiConsumer<String, VetDTO> setAnimal;

        Animal(Function<Main, MultipartFile> getMultipartFile,
                Function<Main, String> getDirectory,
                BiConsumer<String, VetDTO> setAnimal) {
            this.getMultipartFile = getMultipartFile;
            this.getDirectory = getDirectory;
            this.setAnimal = setAnimal;
        }

        public void store(Main context, VetDTO vetDTO) {
            MultipartFile multipartFile = getMultipartFile.apply(context);
            String directory = getDirectory.apply(context);
            setAnimal.accept(directory, vetDTO);
        }
    }

    public static class VetDTO {

        public void setDog(String dogDirectory) {}

        public void setCat(String catDirectory) {}

        public void setLion(String lionDirectory) {}

        public void setBug(String bugDirectory) {}

        public void setMouse(String mouseDirectory) {}

        public void setBunny(String bunnyDirectory) {}

    }

}

推荐阅读