Reputation: 21
converting this nested iteration is blowing my mind could someone convert this to a parallel stream? I want to be able to check for assignments that match my criteria for each of my account team members. I've just switched to java 8 and am struggling to wrap my head around the best way to leverage parallel streams to preform this aggregation.
for(Iterator<BasicDBObject> iterator = members.iterator(); iterator.hasNext();) {
BasicDBObject member = iterator.next();
//if the member doesn't have a valid assignment remove them.
boolean memberContainsValidAssignment = false;
BasicDBObject role = member.get("accountTeamRole") == null ? null : (BasicDBObject) member.get("accountTeamRole");
if (accTeamRoleCodes != null && !accTeamRoleCodes.contains(role.get("code"))) {
iterator.remove();
continue;
}
List<BasicDBObject> assignments = member.get("assignments") == null ? new ArrayList<>() : (List) member.get("assignments");
for (Iterator<BasicDBObject> assignIterator = assignments.iterator(); assignIterator.hasNext(); ) {
BasicDBObject assignment = assignIterator.next();
Date endDate = (Date) assignment.get("assignmentValidToDate");
Date startDate = (Date) assignment.get("assignmentValidFromDate");
if(startDate == null){//this is junk, should have never been allowed.
LOGGER.warn("There's no start date for this assignment. {}", assignment.toString());
assignIterator.remove();
continue;
}
//1. open ended assignment, it lives on forever. 2.falls in between active date.
else if(endDate == null ||(activeDate.after(startDate) && activeDate.before(endDate))){
LOGGER.debug("adding an assignment. {}", assignment.toString());
memberContainsValidAssignment = true;
convertDatesToString(assignment);
continue;
}
}
if(!memberContainsValidAssignment){
iterator.remove();
}
}
Upvotes: 2
Views: 133
Reputation: 1495
Here's a shot at converting your code to use streams. Please, check the details of the filter conditions.
List<BasicDBObject> invalidAssignments = members.stream()
.filter(member -> accTeamRoleCodes == null ||
member.get("accountTeamRole") == null ||
accTeamRoleCodes.contains(member.get("accountTeamRole").get("code"))
)
.flatMap(member -> member.get("assignments").stream())
.filter(assignment -> (Date) assignment.get("assignmentValidFromDate") != null &&
((Date) assignment.get("assignmentValidToDate") != null ||
(activeDate.after((Date)assignment.get("assignmentValidFromDate")) &&
activeDate.before((Date)assignment.get("assignmentValidToDate"))))
)
.collect(Collectors.toList());
To make things parallel would just be a matter of using members.parallelStream
instead of members.stream
.
Upvotes: 1