2016-08-01 54 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());