用于 Arraylist 处理和调用不同方法的高效 Java 构造



拜托,在Java 8之后,是否有一种优雅而有效的方法来执行以下操作,即1. 遍历数组列表2. 读取对象3. 使用数组列表项中包含的值调用可能不同的对象的不同方法

我确实看了流,切换语句,但它比我的 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{
                 }
            }

我认为您遇到了一些XY问题。我会在更高级别重构它以封装字符串及其相关操作。下面是使用枚举的粗略概念:

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 {
            // ...
        }
    }
}

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

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());
}

相关内容

  • 没有找到相关文章

最新更新