用于Arraylist Processing的高效Java构造并调用不同的方法

问题描述 投票:0回答:2

请在Post Java 8中执行以下操作是否有优雅而有效的方法,即1.通过arraylist循环2.读取对象3.使用arraylist项中包含的值调用可能不同的对象的不同方法

我确实看过溪流,切换声明,但它比我的if-else更乱。

任何帮助将不胜感激。只是寻找持续改进

List<JAXBElement<? extends Serializable>> bodyElements = eventRequestBodyTypeSrc.getContent();

            for(JAXBElement element: bodyElements){

                if(element.getName().getLocalPart().equalsIgnoreCase("A")){
                    methodA(element.getValue());
                }else if(element.getName().getLocalPart().equalsIgnoreCase("B")){
                     methodB(element.getValue());
                }else if(element.getName().getLocalPart().equalsIgnoreCase("C")){
                     methodC(element.getValue());
                }else if(element.getName().getLocalPart().equalsIgnoreCase("D")){
                     methodD(element.getValue());
                }else if(element.getName().getLocalPart().equalsIgnoreCase("E")){
                     methodE(element.getValue());
                }else{
                 }

            }
java java-8 jaxb java-9 java-11
2个回答
0
投票

我想你有一点XY Problem正在进行中。我会在更高级别重构这个以封装字符串及其相关操作。这是使用枚举的粗略概念:

enum Action {
    A("a") {
        @Override
        void doSomething(Serializable value) {
            // ...
        }
    },
    B("b") {
        @Override
        void doSomething(Serializable value) {
            // ...
        }
    };

    private static final Map<String, Action> actionsByName = Arrays.stream(values())
            .collect(Collectors.toMap(a -> a.name, a -> a));

    private final String name;

    Action(String name) {
        this.name = name;
    }

    abstract void doSomething(Serializable value);

    public static void processElement(JAXBElement<? extends Serializable> element) {
        Action action = actionsByName.get(element.getName().getLocalPart().toLowerCase());
        if (action != null) {
            action.doSomething(element.getValue());
        } else {
            // ...
        }
    }
}

0
投票

作为精益解决方案,我会首先收集所有映射,如下所示:

Map<String, Consumer<Serializable>> dispatchers = new HashMap<>();
dispatchers.put("A", this::methodA);
// etc.

...并调度这样的元素:

Consumer<Serializable> dispatcher = dispatchers.get(element.getName().getLocalPart().toUpperCase(Locale.US));
if (dispatcher != null) {
    dispatcher.accept(element.getValue());
}
© www.soinside.com 2019 - 2024. All rights reserved.