2017-08-21 9 views
0

jsonファイルをステップ実行し、ファイルの属性によって異なる処理を行うswitch文があります。例えば:Javaの8リファクタリングステートメント各ケースで異なることを行う

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

これらケースステートメントは、異なるオブジェクト(ProductProductLine、及びVendor)と連携し、各ケースが時々ProducerConsumer、又はFunctionインタフェースを必要とするので、どのようにIは、好ましくは、(全体のスイッチをリファクタリングすることができいくつかの種類のLambdasを使用して)?私はマップを使用することを考えましたが、キーは「製品クラス」のようにそうですが、値は何ですか?

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

ありがとうございます。私は必ずしも3つのパラメタの両方を常に必要としません。そこで、for-eachにif文を追加しました。 – user1660256

+1

オブジェクトを使用しないでください。あなたのコードを使って他の人について考える。 –

関連する問題