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
Post a Comment