2016-08-01 5 views
-1

私は文字列のマップのマップを持っています。このマップは、jsonオブジェクトの解析であり、ユーザーがUIでリストをフィルタリングするために入力した条件を表します。 私はこのマップからのデータでオブジェクトを設定したい残りのサービスです。残念ながら、私はqueryModelオブジェクトを変更することはできません。 Query Modelオブジェクトにはフィルタのリストがあります。各フィルターには、フィールドのリストとフィールドに適用される操作のリストがあります。私の目標はjava 8ストリームで次のコードを変換することです。Javaストリームを学ぶ、外部ループからネストされたループに値を関数的に渡す方法

for(Map.Entry<String,Map<String,String>> entry: filters.entrySet()) { 
     Filter filter = new Filter(); 
     filter.setFields(new ArrayList<String>()); 
     filter.getFields().add(entry.getKey()); 
     filter.setValues(new ArrayList<String>()); 
     filter.setOperators(new ArrayList<String>()); 
     if (entry.getValue() != null) { 
      for(String key : entry.getValue().keySet()) { 
       if(key.equals("value")) { 
        filter.getValues().add(entry.getValue().get(key)); 
       } 
       else if(key.equals("matchMode")){ 
        filter.getOperators().add(entry.getValue().get(key)); 
       } 
      } 
      queryModel.getFilters().add(filter); 
     } 

あなたは、私が最初に入力された値と一致モードを取得するための値でそのフィールドIループのために、その後フィールドリスト内のフィールドの名前を設定すると見ることができるように。機能的には、外側のループのフィールドを保存して内側のループで作成されたフィルタオブジェクトに設定することはわかりません。私はQueryModelAdapter.getFilterにフラットマップのエントリを必要とする私の試み

public static Filter getFilter(Map.Entry<String,String> entry) { 
    Filter filter = new Filter(); 
    filter.setFields(new ArrayList<String>()); 
    filter.getFields().add(entry.getKey()); 
    filter.setValues(new ArrayList<String>()); 
    filter.setOperators(new ArrayList<String>()); 
    if(entry.getKey().equals("value")) { 
     filter.getValues().add(entry.getValue()); 
    } 
    else if(entry.getKey().equals("matchMode")){ 
     filter.getOperators().add(entry.getValue()); 
    } 
    return filter; 
} 


List<Filter> filterList = filters.entrySet().stream() 
     .filter(stringMapEntry -> stringMapEntry.getValue() != null) 
     .flatMap(entry -> entry.getValue().entrySet().stream()) 
     .map (innerEntry-> QueryModelAdapter.getFilter(innerEntry)) 
     .collect (Collectors.toList()); 
    queryModel.setFilters (filterList); 

た 。どうやってやるの?

+1

として、それを命名「私のためのコードを書く」の質問には、SOのためにオフトピックです。コードの問題と予想した内容の説明を記述すると、助けがはるかに簡単になります。 'フィルタ'とは何ですか? – 4castle

答えて

1

私が何かを言う前に、質問するときは丁寧に答えてください。誰もここで質問に答えるために支払われることはありません。すべてが彼らの喜びのためにそれをしています。 少なくとも、あなたの言葉で彼らに親切にしてください。


さてさて、私はあなたの質問がStackOverflowのよりCodeReviewに適していると思います。

1つのことメモlambdaとストリームを持つすべての単一の行を持つようにレガシーJavaプロジェクトを書き直すことはできません。

時には、新しい機能よりも古い方法が優れています。

マップを反復して一致する値を取得する必要はありません。その内部ループを削除することができます。

のは、(あなたがからコードをコピーしたものは何でもクラス)あなたの現在のクラスを見てみましょうRespectOthers.java

private static Filter getEmptyFilter(){ 
     Filter filter = new Filter(); 
     filter.setFields(new ArrayList<String>()); 
     filter.setValues(new ArrayList<String>()); 
     filter.setOperators(new ArrayList<String>()); 

     return filter; 
} 

private static Filter setKeyAndValues(Filter inputFilterObj, Map.Entry<String,Map<String,String>> entry, QueryModel queryModel){ 

    inputFilterObj.setFields(new ArrayList<String>()); 
    inputFilterObj.getFields().add(entry.getKey()); 

    if (entry.getValue() != null) { 
      inputFilterObj.getValues().add(entry.getValue().get("value")); 
      inputFilterObj.getOperators().add(entry.getValue().get("matchMode")); 

      queryModel.getFilters().add(inputFilterObj); 
    } 

    return inputFilterObj; 

} 

List<Filter> finalOutput = filters.entrySet().stream() 
          .map(e -> RespectOthers.setKeyAndValues(RespectOthers.getEmptyFilter(), e, myQueryModel)) 
          .collect(Collectors.toList());