【发布时间】:2021-09-01 14:59:10
【问题描述】:
我仍在学习java8,但这就是我基本上想要做的事情。我这里有这个方法,我想转换成流。
public void checkCustomers() {
List<Student> students = studentRegistry.getAllStudents();
List<Student> mathStudents = new ArrayList<>();
List<Customer> studentCustomers = new ArrayList<>();
for (Student student : students) {
if (!student.getAll().contains(Classes.MATH101)) {
mathStudents.add(student);
}
}
for (Student student : mathStudents){
List<Customer> tempStudentCustomers = getCustomers(student.getId());
studentCustomers.addAll(tempStudentCustomers);
}
cancelCustomers(studentCustomers);
}
我已经为此工作了一段时间并且遇到了很多问题。我基本上是在尝试做这样的事情:
cancelCustomers(studentRegistry.getAllStudents().stream()
.filter(Objects::nonNull)
.filter(p -> (p.getAll().contains(Classes.MATH101)))
.collect(Collectors.toList()));
我知道这不起作用的原因有很多,但每次我修复其中一个时,似乎都会弹出一个不同的问题。如有必要,我可以共享其他代码,但我想要做的主要内容在这里。
【问题讨论】:
-
cancelCustomers(studentRegistry.getAllStudents().stream().filter(Objects::nonNull). filter(p -> ( p.getAll().contains(Classes.MATH101))). .map(s->getCustomers(s.getId())).collect(Collectors.toList())); -
在我看来问题已经存在于原始代码中,甚至在您开始将其转换为流代码之前。您是否知道循环
for (Student student : mathStudents) { studentCustomers = getCustomers(student.getId()); }将反复覆盖studentCustomers变量,因此只保留最后一个值? -
方法
getCustomers是否返回Student实例的集合,您是否暗示收集所有 个学生客户然后取消它们?同样定义mathStudents的逻辑似乎是倒置的:为什么班级不包含Math101的学生被添加到mathStudents?
标签: java java-8 java-stream