2017-10-08 3 views
2

があります彼らのコース? フィルタのリストフィールドによってオブジェクトのリスト

  • は、最初私はこの質問に答えるために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のみすべてのCourse sは"Algorithms"命名されていることをあなたにStudent Sを与えるだろう。

  • anyMatchはあなたに"Algorithms"という名前の少なくとも一つCourseを持つすべてのStudent秒を与えます。

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'は学生であり、do stream()メソッドがありません。その後、あなたは
  • allMatch利回りtrueに、さらに学生を集めることができないため、リスト内のすべての要素が述語に一致する場合
  • 次の場合、ストリームにコースの学生のリストを変換するfalseをflatMap()を使用することはできません一致しない要素が1つあります。したがって、コードが正しいとすれば、すべての生徒のコースに「アルゴリズム」という名前が付いているかどうかをテストしますが、条件に一致する要素が1つあるかどうかをテストしたいと考えています。 allMatchanyMatchの返品リストではなく、booleanを返すため、フィルタで使用することができます。
+0

:また、あなたは、次のようfiltermethod referencesを使用することができます説明を提供する。 –

+0

いいえ、私はこの回答に答えるうちに、他の答えは間違っていました。私がこれを入力している間に編集されました。 –

1

私は@Eranに同意します。あなたは少しのコード・ダンプよりも、彼であるので、あなたは10分の1がすでに掲載された後、前の回答よりも低品質の答えを投稿している

students.stream() 
      .filter(s -> s.getCourses().stream() 
        .map(Course::getName) 
        .anyMatch("Algorithms"::equals) 
      ).collect(Collectors.toList()); 
関連する問題