java - Stuck with java8 lambda expression -
i have map<integer,doctor> doclib=new hashmap<>(); save class of doctor.
class doctor has methods:getspecialization() return string,
getpatients() return collection of class person.
in main method, type:
public map<string,set<person>> getpatientsperspecialization(){ map<string,set<person>> res=this.doclib.entryset().stream(). map(d->d.getvalue()). collect(groupingby(d->d.getspecialization(), d.getpatients()) //error ); return res; } as can see, have problem groupingby,i try send same value d method, it's wrong. how solve this?
you need second collector mapping :
public map<string,set<person>> getpatientsperspecialization(){ return this.doclib .values() .stream() .collect(colectors.groupingby(doctor::getspecialization, collectors.mapping(doctor::getpatients,toset())) ); } edit:
i think original answer may wrong (it's hard without being able test it). since doctor::getpatients returns collection, think code may return map<string,set<collection<person>>> instead of desired map<string,set<person>>.
the easiest way overcome iterate on map again produce desired map :
public map<string,set<person>> getpatientsperspecialization(){ return this.doclib .values() .stream() .collect(colectors.groupingby(doctor::getspecialization, collectors.mapping(doctor::getpatients,toset())) ) .entryset() .stream() .collect (collectors.tomap (e -> e.getkey(), e -> e.getvalue().stream().flatmap(c -> c.stream()).collect(collectors.toset())) ); } perhaps there's way same result single stream pipeline, can't see right now.
Comments
Post a Comment