2017-08-21 80 views
0

我有一個switch語句,通過json文件逐步執行,並根據文件中的屬性執行不同的操作。例如:Java 8重構switch語句,爲每種情況做不同的事情

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

由於這些case語句與不同的對象(ProductProductLine,和Vendor)工作,每一種情況下,有時需要ProducerConsumer,或Function接口,我怎樣才能重構整個開關(優選使用某種類型的Lambdas)?我想過使用Map,關鍵是如「產品類」,但價值是什麼?

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

感謝您的幫助!

+0

你能不能建立反映JSON結構的一類,只是解析輸入? – PanBrambor

回答

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

編輯:也許他想的somethink這樣;

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) 
+0

這看起來很酷,但我的領導不喜歡forEach語句。他告訴我使用創建者/解析器模式,我不知道這是什麼! – user1660256

+1

喜歡與否對代碼的工作方式沒有影響,請告訴他抓住現實。 ;) – PanBrambor

+1

難道你只是**三重**的迭代次數? – GhostCat

-1

嗯,我想我已經回答了我的問題。我定義每種情況下爲BiConsumer<String, Object>(),和我設置了每個屬性的Map及其BiConsumer像這樣:

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); 
+0

你不必使用BiConsumer。您可以使用接受值,產品和供應商的方法編寫自己的界面。 – VGR

+0

謝謝。儘管我並不總是需要全部三個參數。所以我只是在for-each中添加了一個if語句。 – user1660256

+1

請勿使用對象。用你的代碼思考別人。 –

相關問題