learning java stream, how to pass a value from the outer loop to the nested loop in a functional way -
i have map of map of strings. map parsing of json object , represents criteria entered user filter list in ui. in rest service want populate object data comes map. unfortunately cannot change querymodel object. query model object has list of filters. each filter has list of fields , list of operations applied field. goal convert following code 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); }
as can see first set name of field in fields list , field loop in values value entered , match mode. in functional don't know ho save field of outer loop set in filter object created in inner loop. attempt
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);
i need in querymodeladapter.getfilter entry of flat map. how can that?
before anything, polite when asking questions. nobody gets paid answering questions here. doing pleasure. so, nice them @ least words.
alright, think question more suitable codereview stackoverflow.
one thing note, you can't rewrite legacy java projects have every single line lambdas , streams.
sometimes, it's better old fashioned way new features.
you don't need iterate map retrieve matching value. can remove inner-loop.
let's take current class (whatever class copied code from) named 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());
Comments
Post a Comment