Java 8 学习java stream,如何以函数方式将值从外部循环传递到嵌套循环
我有一张字符串的地图。此映射是对json对象的解析,表示用户为过滤UI中的列表而输入的条件。 在rest服务中,我想用来自此映射的数据填充一个对象。不幸的是,我无法更改queryModel对象。查询模型对象具有筛选器列表。每个筛选器都有一个字段列表和要应用于该字段的操作列表。我的目标是用Java8流转换以下代码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
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无关。如果您描述代码的问题并描述您期望的内容,将更容易提供帮助。什么是过滤器
?