2017-10-08 115 views
2

有對學生和課程兩個滑動對象是這樣的:由列表字段進行篩選對象的列表

public class Student { 
    List<Course> courses; 
    ... 
} 
public class Course { 
    String name; 
    ... 
} 

如果我們有Students一個list,我們怎樣才能通過的名稱進行篩選一些學生他們的課程?

  • 首先我嘗試flatMap回答這個問題,但它返回當然 對象,而不是學生的對象。
  • 然後我使用allMatch(以下代碼)。然而 返回學生名單,但始終List是空的。什麼是 問題?
List<Student> studentList; 
List<Student> AlgorithmsCourserStudentList = studentList.stream(). 
    filter(a -> a.stream().allMatch(c -> c.getCourseName.equal("Algorithms"))). 
    collect(Collectors.toList()); 

回答

7

您需要anyMatch

List<Student> studentList; 
List<Student> algorithmsCourseStudentList = 
    studentList.stream() 
       .filter(a -> a.getCourses() 
          .stream() 
          .anyMatch(c -> c.getCourseName().equals("Algorithms"))) 
       .collect(Collectors.toList()); 
  • allMatch只會給你Student s表示他們所有的Course s的命名"Algorithms"

  • anyMatch會給你所有Student S作至少一個Course命名"Algorithms"

2

對於每個學生獲得課程,並查找是否有任何匹配的課程名稱的學生的課程。

Course.java:

public class Course { 
    private String name; 

    public String getName() { 
     return name; 
    } 
} 

Student.java:

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.Collectors; 

public class Student { 
    private List<Course> courses; 

    public List<Course> getCourses() { 
     return courses; 
    } 

    public static void main(String... args) { 
     List<Student> students = new ArrayList<>(); 

     List<Student> algorithmsStudents = students.stream() 
       .filter(s -> s.getCourses().stream().anyMatch(c -> c.getName().equals("Algorithms"))) 
       .collect(Collectors.toList()); 
    } 
} 

編輯:

List<Student> AlgorithmsCourserStudentList = studentList.stream(). 
    filter(a -> a.stream().allMatch(c -> c.getCourseName.equal("Algorithms"))). 
    collect(Collectors.toList()); 
  • 這裏您的代碼將無法編譯,在過濾器'a'是一名學生,這是做的es沒有stream()方法。
  • 不能使用flatMap()到課程的學生的名單轉換爲流,因爲那時你不能收取學生進一步上
  • allMatch產量true如果列表中的所有元素相匹配的謂語,false如果有一個元素不匹配。因此,如果代碼是正確的你會被測試,如果所有的學生的課程有名稱爲「算法」,但要測試是否有符合條件的單個元素。請注意,allMatchanyMatch不需要返回列表,它們會返回boolean,這就是您可以在過濾器中使用它們的原因。
+0

要發佈一個答案一次10分鐘的已經發布後,比以前的答案低質量的,因爲你是比代碼轉儲和他多一點提供解釋。 –

+0

不,另一個答案在我回答這個問題時是不正確的。我在輸入時編輯了它。 –

1

我同意@Eran。您也可以在filter使用method references如下:

students.stream() 
      .filter(s -> s.getCourses().stream() 
        .map(Course::getName) 
        .anyMatch("Algorithms"::equals) 
      ).collect(Collectors.toList());