我有一个switch语句,它逐步执行json文件,并根据文件中的属性执行不同的操作。例如:
dataMap.forEach((k, v) -> {
Product product = new Product();
ProductLine productLine = new ProductLine();
Vendor currentVendor = new Vendor();
// Step over each atttribute in the line of the file
v.forEach((k2, v2) -> {
switch(k2) {
case "Product Class": {
Set<ProductCategory> categories = new HashSet<>();
try {
List<String> categoryList = Arrays.asList(v2.split(","));
categoryList.forEach(it ->{
ProductCategory category = ProductCategory.loadTypeByValue(it.trim());
categories.add(category);
});
product.setProductCategories(categories);
} catch (Exception e) {
//
}
break;
}
case "Product Name": {
product.setName(v2);
productLine.setName(v2);
break;
}
case "SKU": {
product.setSKU(v2);
break;
}
case "Name": {
vendor.setName(v2);
}
....
由于这些案例陈述适用于不同的对象(Product
,ProductLine
和Vendor
),并且每种情况有时需要Producer
,Consumer
,或Function
接口,如何重构整个开关(最好使用某种Lambda)?我想过使用一个Map,关键就是这样,就像“产品类”一样,但是它的价值是什么?
Map <String, ?> = new HashMap<>();
感谢您的帮助!
答案 0 :(得分:-1)
这只是一个想法,但为什么不做这样的事情:
dataMap.forEach((k, v) -> {
Product product = new Product();
ProductLine productLine = new ProductLine();
Vendor currentVendor = new Vendor();
List<Entry<K,V>> vSet = v.entrySet();
vSet.stream().filter((v)->"Product Class".equals(v.getKey()))
.foreach((v)->addCategoriesToProduct(product, v.getKey(), v.getValue()));
vSet.stream().filter(((v)->"Product Name".equals(v.getKey()))
.foreach((v)->fillProductName(product, v.getValue()));
vSet.stream().filter((v)->"SKU".equals(v.getKey()))
.foreach((v)->fillProductName(product, v.getValue()));
编辑:也许他想要这样想;
r = new ProductAttributeResolver( v.entrySet());
product.setCategories(r.getAllCategories());
product.setName(r.getProductName());
...
然后getProductName将如下所示:
return vSet.stream().filter(((v)->"Product Name".equals(v.getKey()))
.map((v)->v.getValue())
.findFirst()
.orElse(null)
答案 1 :(得分:-1)
嗯,我想我已经回答了我自己的问题。我将每个案例定义为BiConsumer<String, Object>()
,并且我为每个属性及其BiConsumer设置Map
,如下所示:
final static Map<String, BiConsumer<String, Object>> attributeMap = new HashMap<>();
private BiConsumer<String, Object> setVendorName = new BiConsumer<String, Object>() {
@Override
public void accept(String value, Object obj) {
((Vendor)obj).setName(value);
}
};
attributeMap.put("Vendor Name", setVendorName);