学习java流,如何以函数方式将值从外部循环传递给嵌套循环

时间:2016-08-01 12:10:49

标签: java-8 java-stream

我有一张字符串地图的地图。此映射是json对象的解析,表示用户输入的用于过滤UI中列表的条件。 在休息服务中,我想用来自此映射的数据填充对象。不幸的是我无法更改queryModel对象。 Query Model对象有一个过滤器列表。每个过滤器都有一个字段列表和一个要应用于该字段的操作列表。我的目标是使用java 8 stream转换以下代码。

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 个答案:

答案 0 :(得分:2)

在我说什么之前,在提问时要礼貌。在这里回答问题没有人获得报酬。一切都是为了他们的乐趣。 所以,至少用你的话语对他们好。

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

注意的一件事,您无法重写旧的Java项目,以使每一行都拥有lambdas和流。

有时候,老式的方式比新功能更好。

您不需要迭代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());