拜托,在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());
}