Java 8重构switch语句,为每种情况做不同的事情

时间:2017-08-21 13:25:15

标签: java java-8 switch-statement refactoring

我有一个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);
                }
           ....

由于这些案例陈述适用于不同的对象(ProductProductLineVendor),并且每种情况有时需要ProducerConsumer,或Function接口,如何重构整个开关(最好使用某种Lambda)?我想过使用一个Map,关键就是这样,就像“产品类”一样,但是它的价值是什么?

Map <String, ?> = new HashMap<>();

感谢您的帮助!

2 个答案:

答案 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);