Convert iterator code to Stream

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

Answers (1)

rrufai
rrufai

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

Related Questions