2015-11-20 135 views
2

我正在寻找一些帮助来转换一些代码,我必须使用真正漂亮的Java 8 Stream库。基本上我有一堆学生的对象,我想找回过滤对象的列表如下所示:使用Java筛选结果集的多个条件8

List<Integer> classRoomList; 
Set<ScienceStudent> filteredStudents = new HashSet<>(); 

//Return only 5 students in the end 
int limit = 5; 
for (MathStudent s : mathStudents) 
{ 
    // Get the scienceStudent with the same id as the math student 
    ScienceStudent ss = scienceStudents.get(s.getId()); 
    if (classRoomList.contains(ss.getClassroomId())) 
    { 
     if (!exclusionStudents.contains(ss)) 
     { 
      if (limit > 0) 
      { 
       filteredStudents.add(ss); 
       limit--; 
      } 
     } 
    } 
} 

当然上面是一个超级做作的例子,我做了学习更多的Java的缘故8.假设所有学生都是从学生对象中延伸的,其中studentIdclassRoomId。我需要的另一个要求是让结果成为不可变集合。

+3

这是不是可以不实际的类和状态很容易地编译代码。你为什么不创建一个最小,紧凑和可验证的例子来说明你遇到的具体问题?有一个流过滤器的操作符,我认为它不会更清晰。 –

回答

3

相当直译(和所需的类打转转)

interface ScienceStudent { 
    String getClassroomId(); 
} 
interface MathStudent { 
    String getId(); 
} 

Set<ScienceStudent> filter(
     Collection<MathStudent> mathStudents, 
     Map<String, ScienceStudent> scienceStudents, 
     Set<ScienceStudent> exclusionStudents, 
     List<String> classRoomList) { 

    return mathStudents.stream() 
      .map(s -> scienceStudents.get(s.getId())) 
      .filter(ss -> classRoomList.contains(ss.getClassroomId())) 
      .filter(ss -> !exclusionStudents.contains(ss)) 
      .limit(5) 
      .collect(Collectors.toSet()); 

} 

多个条件真的只过滤翻译成多.filter来电或联合大过滤器像ss -> classRoomList.contains(ss.getClassroomId()) && !exclusion...

关于不变集:您最好手动包装结果,因为collect需要一个可以从流中填充并返回完成的可变集合。我没有看到一个简单的方法直接使用流。


null偏执版本

return mathStudents.stream().filter(Objects::nonNull) // math students could be null 
      .map(MathStudent::getId).filter(Objects::nonNull) // their id could be null 
      .map(scienceStudents::get).filter(Objects::nonNull) // and the mapped science student 
      .filter(ss -> classRoomList.contains(ss.getClassroomId())) 
      .filter(ss -> !exclusionStudents.contains(ss)) 
      .limit(5) 
      .collect(Collectors.toSet()); 
+1

你错过了关于'exclusionStudents'的一点。 –

+2

@PaulBoddington thx,刚刚注意到并修复了 – zapl

+0

这个流如何在每一步处理可能的空值? –