(Java)如何从对象列表中查找特定元素的出现? (不是元素列表)

时间:2017-02-08 02:03:31

标签: java lambda java-8 java-stream

我列出了不同科目的学生及其各自的成绩。 我想知道他们中有多少人至少得到了3' F'

让我描述一下我的情况。

我有一个看起来像这样的学生名单(或多或少):

List<Student> studentsList= {Alpha, Beta, Gamma...};

学生班:

public class Student {
    private int studentId;
    private String studentName;
    private List<Grade> gradesList;

    public Student(int studentId, String studentName) {
        this.studentId = studentId;
        this.studentName = studentName;
        gradesList = new ArrayList<>();
    }

    public int getStudentId() {
        return studentId;
    }

    public String getStudentName() {
        return studentName;
    }

    @Override
    public String toString() {
        return "Student{" + "studentId=" + studentId + ", studentName=" + studentName + '}';
    }

    public void print() {
        System.out.println(studentName);
    }

    public List<Grade> getGradesList() {
        return gradesList;
    }
}

年级:

public class Grade {
    private Course course;
    private int semesterId;
    private String grade;

    public Grade() {
    }

    public Grade(Course course, int semesterId, String grade) {
        this.course = course;
        this.semesterId = semesterId;
        this.grade = grade;
    }

    public Course getCourse() {
        return course;
    }

    public int getSemesterId() {
        return semesterId;
    }

    public String getGrade() {
        return grade;
    }

    @Override
    public String toString() {
        return "Grade{" + "course=" + course + ", semesterId=" + semesterId + ", grade=" + grade + '}';
    }
}

我相信通过使用studentsList搜索每个gradeList,我可以得到我想要的东西。

但是我想用stream()和lambda表达式来做。但无法弄清楚如何?

这就是我可以计算出有多少学生的姓名超过15位并且ID大于14900的方式:

 List<Student> filteredList = studentsList.stream()
                .filter(s -> s.getStudentName().length() > 15)
                .filter(s -> s.getStudentId() > 14900)
                .collect(Collectors.toList());

        filteredList.forEach(System.out::println);

        long count = filteredList.stream().count();
        System.out.println(count + " entries");

P.S。如果问题遗漏了一些内容请告诉我什么。我会努力提供尽我所能。

TIA。

澄清:

我知道如何计算List中与谓词匹配的元素数。但是当每个List包含一个对象并且我必须找出该对象的某个属性的值时,我可以在任何地方找到任何有用的东西。

编辑:

这是what happens如果我尝试按照我的正常意义说的那样:

编辑2:

管理要做,虽然不是嵌套的流(),但使用增强的for循环,然后使用其中的stream()。

System.out.println("Printing failed student list.");
        List<Grade> gradeList;

        int failCount = 0;
        for (Student student : studentsList) {
            gradeList = student.getGradesList().stream()
                    .filter(g -> g.getGrade().equals("F"))
                    .collect(Collectors.toList());
            long count = gradeList.stream().count();
            if (count > 2) {
                ++failCount;
            }
        }
        System.out.println("Total: " + failCount + " entries.");

仍然试图弄清楚如何只使用stream()。

0 个答案:

没有答案