Эффективная Java-конструкция для обработки Arraylist и вызова различных методов - PullRequest
0 голосов
/ 24 апреля 2019

Пожалуйста, существует ли элегантный и эффективный способ сделать следующее в Post Java 8, т. Е. 1. Цикл по массиву 2. Чтение объекта 3. Вызов различных методов потенциально разных объектов с использованием значений, содержащихся в элементах массива

Я смотрел на потоки, оператор switch, но это было намного грязнее, чем мое 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{
                 }

            }

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Я думаю, что у вас есть небольшая проблема 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 {
            // ...
        }
    }
}
0 голосов
/ 24 апреля 2019

В качестве рационального решения я сначала собрал бы все отображения следующим образом:

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