2016-08-01 55 views
-1

我有一個字符串映射圖。此映射是對json對象的解析,並表示用戶輸入的用於在UI中過濾列表的條件。 在剩下的服務中,我想用來自這張地圖的數據填充一個對象。不幸的是我不能改變queryModel對象。查詢模型對象有一個過濾器列表。每個過濾器都有一個字段列表和一個應用於該字段的操作列表。我的目標是轉換下面的代碼與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); 
     } 

正如你可以看到我先在字段列表設置字段的名稱,然後在值那場我環路獲得輸入值和匹配模式。在函數中,我不知道要保存外循環的字段,以便將其設置在內循環中創建的過濾器對象中。 這是我嘗試

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

我QueryModelAdapter.getFilter需要的平面地圖的入口。我怎樣才能做到這一點?

+1

「編寫代碼爲我」的問題是題外話了SO。如果您使用代碼描述問題並描述您的預期,則幫助起來會更容易。什麼是「過濾器」? – 4castle

回答

1

在我提出任何問題之前,請在提問時保持禮貌。沒有人在這裏回答問題獲得報酬。所有這些都是爲了他們的快樂。 所以,至少要用你的話對他們好。


好吧,我覺得你的問題是更適合CodeReview比StackOverflow上。

一件事note,你不能重寫你的遺留java項目,以使每一行都有lambda表達式和流。

有時,它比舊的方式比新的功能更好。

您不需要迭代Map以檢索其匹配值。您可以刪除該內部循環。

讓我們把你的當前類(不管類複製從代碼)命名爲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());