我列出了不同科目的学生及其各自的成绩。 我想知道他们中有多少人至少得到了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()。