2015-09-04 181 views
2

转换此嵌套迭代正在吹我的脑海有人可以将其转换为并行流吗?我希望能够检查与我的每位客户团队成员的标准相符的分配。我刚刚切换到了Java 8,并且正在努力围绕利用并行流来完成此聚合的最佳方式。将迭代器代码转换为流

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(); 
    } 
} 
+1

流不会让你从底层集合中删除任何东西。 –

+0

如何根据相同的标准制作新清单?我遇到的问题是三元操作和if语句。也不知道我怎么会去做像调用转换日期.. –

+0

国际海事组织,你的代码看起来很好,因为它是。我认为这不是Streams的任务。 – Tunaki

回答

1

下面是将您的代码转换为使用流的一个镜头。请检查过滤条件的细节。

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()); 

为了使平行的东西也只是用members.parallelStream代替members.stream的问题。