How can I simplify the following code? Can it be written as a single stream-statement?
Clarification: multiple id of branch can correspond to the same appName
My code:
Map<String, Map<Long, BranchSession>> sessions = new HashMap<>();
Map<String, Map<Long, List<Branch>>> map = branches.stream()
.collect(
Collectors.groupingBy(
Branch::getAppName,
Collectors.groupingBy(Branch::getId)
));
map.forEach((key, value) -> {
Map<Long, BranchSession> bs = new HashMap<>();
value.keySet().forEach(bId -> {
List<Branch> list = value.get(bId);
if (list.size() > 0)
bs.put(bId, new BranchSession(value.get(bId).get(0)));
});
sessions.put(key, bs);
});
CodePudding user response:
I'm assuming that there could be multiple id that correspond to the same appName (otherwise creating such a nested map is unnecessary, if each appName corresponds to a single unique id you can create two separate maps: branchSession by id Map<Long, BranchSession> and branchSession by name Map<String, BranchSession> which would be more convenient).
If my assumption is correct, you can apply collector toMap as the downstream of groupingBy:
Map<String, Map<Long, BranchSession>> branchSessionByIdAndByName = branches.stream()
.collect(Collectors.groupingBy(
Branch::getAppName,
Collectors.toMap(
Branch::getId,
branch -> new BranchSession(branch.getId())
)
));
