Java 8 学习java stream,如何以函数方式将值从外部循环传递到嵌套循环

Java 8 学习java stream,如何以函数方式将值从外部循环传递到嵌套循环,java-8,java-stream,Java 8,Java Stream,我有一张字符串的地图。此映射是对json对象的解析,表示用户为过滤UI中的列表而输入的条件。 在rest服务中,我想用来自此映射的数据填充一个对象。不幸的是,我无法更改queryModel对象。查询模型对象具有筛选器列表。每个筛选器都有一个字段列表和要应用于该字段的操作列表。我的目标是用Java8流转换以下代码 for(Map.Entry<String,Map<String,String>> entry: filters.entrySet()) { Fil

我有一张字符串的地图。此映射是对json对象的解析,表示用户为过滤UI中的列表而输入的条件。 在rest服务中,我想用来自此映射的数据填充一个对象。不幸的是,我无法更改queryModel对象。查询模型对象具有筛选器列表。每个筛选器都有一个字段列表和要应用于该字段的操作列表。我的目标是用Java8流转换以下代码

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);
        }
for(Map.Entry:filters.entrySet()){
过滤器=新过滤器();
setFields(新的ArrayList());
filter.getFields().add(entry.getKey());
setValues(新的ArrayList());
setOperators(新的ArrayList());
if(entry.getValue()!=null){
for(字符串键:entry.getValue().keySet()){
if(键等于(“值”)){
filter.getValues().add(entry.getValue().get(key));
}
else if(key.equals(“匹配模式”)){
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);
公共静态过滤器getFilter(Map.Entry){
过滤器=新过滤器();
setFields(新的ArrayList());
filter.getFields().add(entry.getKey());
setValues(新的ArrayList());
setOperators(新的ArrayList());
if(entry.getKey().equals(“value”)){
filter.getValues().add(entry.getValue());
}
else if(entry.getKey().equals(“匹配模式”)){
filter.getOperators().add(entry.getValue());
}
回流过滤器;
}
List 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中过滤平面图的条目。我如何才能做到这一点?

在我说话之前,问问题时要有礼貌。在这里回答问题没有人会得到报酬。所有人都是为了自己的快乐而这样做的。 所以,至少用你的话对他们好一点


好吧,我认为你的问题比我的问题更适合我

需要注意的一点是,您不能重写遗留java项目,使其每一行都包含lambda和streams

有时候,传统的方式比新功能要好。

您不需要迭代映射来检索其匹配值。您可以删除该内部循环

让我们将您当前的类(无论您从哪个类复制代码)命名为
reservethers.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());
private静态过滤器getEmptyFilter(){
过滤器=新过滤器();
setFields(新的ArrayList());
setValues(新的ArrayList());
setOperators(新的ArrayList());
回流过滤器;
}
私有静态筛选器setKeyAndValues(筛选器inputFilterObj、Map.Entry条目、QueryModel QueryModel){
设置字段(新的ArrayList());
inputFilterObj.getFields().add(entry.getKey());
if(entry.getValue()!=null){
inputFilterObj.getValues().add(entry.getValue().get(“value”));
inputFilterObj.getOperators().add(entry.getValue().get(“匹配模式”));
queryModel.getFilters().add(inputFilterObj);
}
返回inputFilterObj;
}
List finalOutput=filters.entrySet().stream()
.map(e->reservethers.setKeyAndValues(reservethers.getEmptyFilter(),e,myQueryModel))
.collect(Collectors.toList());
“为我编写代码”的问题与SO无关。如果您描述代码的问题并描述您期望的内容,将更容易提供帮助。什么是
过滤器