lambda - Java 8 - How to group and sum on a list of maps using stream collectors -


i have list of maps , want group , sum on columns.

list of maps:

double min=100; double max=999; list<map<string,object>> positions = new arraylist<map<string,object>>(); (int i=0; i<10; i++) {     map<string,object> positionrow = new hashmap<string,object>();     positionrow.put("id", i+1);     if ((i+1)%2 == 0)         positionrow.put("mod", "even");     else         positionrow.put("mod", "odd");     random r = new random();     double randomvalue = min + (max - min) * r.nextdouble();     positionrow.put("price", randomvalue);     positionrow.put("bigger", (randomvalue > 300)?"y":"n");     positions.add(positionrow); } 

i trying use java 8 stream collectors.groupingby , collectors.summingdouble results map<string,map<string,object>>. far, can map<string,list<map<string,object>>> using java 8 stream collectors.groupingby.

group "mod" , "bigger":

map<string, list<map<string, object>>> grouped = positions.stream()         .collect(                 collectors.groupingby(m -> m.get("mod").tostring()                         + "<|>" + m.get("bigger").tostring())); 

group "mod" , "bigger" results:

{even<|>y=[{mod=even, price=872.729803251601, bigger=y, id=2}, {mod=even, price=353.6589309614915, bigger=y, id=4}, {mod=even, price=981.8179976373482, bigger=y, id=6}, {mod=even, price=942.3538966530067, bigger=y, id=8}, {mod=even, price=919.0174189044218, bigger=y, id=10}], odd<|>y=[{mod=odd, price=663.7589137270676, bigger=y, id=1}, {mod=odd, price=894.1766799283644, bigger=y, id=3}, {mod=odd, price=905.8003509608488, bigger=y, id=5}, {mod=odd, price=758.3085768816934, bigger=y, id=7}, {mod=odd, price=531.1035747782346, bigger=y, id=9}]} 

i expecting group "mod" , "bigger" , sum on "id" , "price" results(map<string,map<string,object>>):

{even<|>y={sum_price=4069.578047, sum_id=30}, odd<|>y={sum_price=3753.148096,sum_id=25}} 

any suggestions? thank you,

map<string, object> not type maintaining objects. that’s why classes , fields having name , declared type invented. required code collector reflects this:

map<string, map<string, object>> grouped = positions.stream() .collect(collectors.groupingby(m -> m.get("mod")+"<|>"+m.get("bigger"),     collector.of(hashmap::new, (m,p)-> {         m.merge("sum_price", p.get("price"), (a,b)->((double)a)+((double)b));         m.merge("sum_id", p.get("id"), (a,b)->((integer)a)+((integer)b));     }, (m1,m2)-> {         m1.merge("sum_price", m2.get("sum_price"), (a,b)->((double)a)+((double)b));         m1.merge("sum_id", m2.get("sum_id"), (a,b)->((integer)a)+((integer)b));         return m1;     }))); 

Comments