2015-11-20 134 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

這個流如何在每一步處理可能的空值? –