import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Ideone {
public static void main
(String[] args
) { Department a = new Department("a");
Department b = new Department("b");
Department c = new Department("c");
Employee e1
= new Employee
("e1",
List.
of(a, b
)); Employee e2
= new Employee
("e2",
List.
of(c, b
)); Employee e3
= new Employee
("e3",
List.
of(c, a
)); Employee e4
= new Employee
("e4",
List.
of(a, b, c
));
List
<Employee
> employees
= List.
of(e1, e2, e3, e4
); Map<Department,List<Employee>> result=employees.stream()
.flatMap(employee->employee.getDepartments().stream()
.map(department->new Pair(department,employee)))
.collect(Collectors.groupingBy(pair->pair.d,
Collectors.mapping(pair->pair.e,
Collectors.toList())));
}
static class Department
{final String name
;Department
(String name
){this.
name=name
;}public String toString
(){return name
;}} static class Employee
{final String name
;final List
<Department
> departments
;Employee
(String name,List
<Department
> departments
){this.
name=name
;this.
departments=departments
;}List
<Department
> getDepartments
(){return departments
;}public String toString
() {return name
;}} // this is just a helper class instead of AbstractMap.whatever
static class Pair{final Department d;final Employee e;Pair(Department d,Employee e){this.d=d;this.e=e;}}
}
aW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKCmNsYXNzIElkZW9uZSB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgRGVwYXJ0bWVudCBhID0gbmV3IERlcGFydG1lbnQoImEiKTsKICAgICAgICBEZXBhcnRtZW50IGIgPSBuZXcgRGVwYXJ0bWVudCgiYiIpOwogICAgICAgIERlcGFydG1lbnQgYyA9IG5ldyBEZXBhcnRtZW50KCJjIik7CgogICAgICAgIEVtcGxveWVlIGUxID0gbmV3IEVtcGxveWVlKCJlMSIsIExpc3Qub2YoYSwgYikpOwogICAgICAgIEVtcGxveWVlIGUyID0gbmV3IEVtcGxveWVlKCJlMiIsIExpc3Qub2YoYywgYikpOwogICAgICAgIEVtcGxveWVlIGUzID0gbmV3IEVtcGxveWVlKCJlMyIsIExpc3Qub2YoYywgYSkpOwogICAgICAgIEVtcGxveWVlIGU0ID0gbmV3IEVtcGxveWVlKCJlNCIsIExpc3Qub2YoYSwgYiwgYykpOwoKICAgICAgICBMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBMaXN0Lm9mKGUxLCBlMiwgZTMsIGU0KTsKICAgICAgICBNYXA8RGVwYXJ0bWVudCxMaXN0PEVtcGxveWVlPj4gcmVzdWx0PWVtcGxveWVlcy5zdHJlYW0oKQogICAgICAgICAgICAuZmxhdE1hcChlbXBsb3llZS0+ZW1wbG95ZWUuZ2V0RGVwYXJ0bWVudHMoKS5zdHJlYW0oKQogICAgICAgICAgICAgICAgLm1hcChkZXBhcnRtZW50LT5uZXcgUGFpcihkZXBhcnRtZW50LGVtcGxveWVlKSkpCiAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShwYWlyLT5wYWlyLmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0b3JzLm1hcHBpbmcocGFpci0+cGFpci5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3RvcnMudG9MaXN0KCkpKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7CiAgICB9CiAgICAKICAgIHN0YXRpYyBjbGFzcyBEZXBhcnRtZW50e2ZpbmFsIFN0cmluZyBuYW1lO0RlcGFydG1lbnQoU3RyaW5nIG5hbWUpe3RoaXMubmFtZT1uYW1lO31wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7cmV0dXJuIG5hbWU7fX0KICAgIHN0YXRpYyBjbGFzcyBFbXBsb3llZXtmaW5hbCBTdHJpbmcgbmFtZTtmaW5hbCBMaXN0PERlcGFydG1lbnQ+IGRlcGFydG1lbnRzO0VtcGxveWVlKFN0cmluZyBuYW1lLExpc3Q8RGVwYXJ0bWVudD4gZGVwYXJ0bWVudHMpe3RoaXMubmFtZT1uYW1lO3RoaXMuZGVwYXJ0bWVudHM9ZGVwYXJ0bWVudHM7fUxpc3Q8RGVwYXJ0bWVudD4gZ2V0RGVwYXJ0bWVudHMoKXtyZXR1cm4gZGVwYXJ0bWVudHM7fXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7cmV0dXJuIG5hbWU7fX0KICAgIC8vIHRoaXMgaXMganVzdCBhIGhlbHBlciBjbGFzcyBpbnN0ZWFkIG9mIEFic3RyYWN0TWFwLndoYXRldmVyCiAgICBzdGF0aWMgY2xhc3MgUGFpcntmaW5hbCBEZXBhcnRtZW50IGQ7ZmluYWwgRW1wbG95ZWUgZTtQYWlyKERlcGFydG1lbnQgZCxFbXBsb3llZSBlKXt0aGlzLmQ9ZDt0aGlzLmU9ZTt9fQp9
{a=[e1, e3, e4], c=[e2, e3, e4], b=[e1, e2, e4]}