Java 8筛选流列表返回的方法



我还在学习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()));

我知道这不起作用的原因有很多,但每次我修复其中一个,一个不同的问题似乎弹出。如果有必要,我可以分享其他代码,但我想做的主要部分在这里。

试试这个:

studentRegistry.getAllStudents().stream().
filter(Objects::nonNull).
filter(p -> ( p.getAll().contains(Classes.MATH101))).
map(std -> getCustomers(std.getId())). // Maps each student to List<Customer>...
collect(Collectors.toList())

上面的流代码片段将返回ListsList。形式为:List<List<Customer>>.

如果您想要将这个列表的列表加入到一个包含所有子元素(客户)的列表中,请在您的代码中添加以下内容:

List<Customer> studentCustomers = studentRegistry.getAllStudents().stream().
filter(Objects::nonNull).
filter(p -> ( p.getAll().contains(Classes.MATH101))).
map(std -> getCustomers(std.getId())). 
flatMap(List::stream). // this here does the magic
collect(Collectors.toList())

但是我认为你的函数代码也有问题…

这部分例如

List<Customer> studentCustomers = new ArrayList<>();

for (Student student : mathStudents){
studentCustomers = getCustomers(student.getId()); //  You update the array of studentCustomers, but you never do anything with it.
// You only cancel the customers of the last found mathStudent...
}
cancelCustomers(studentCustomers); // Is this the right logic?

下面应该没问题。

cancelCustomers(studentRegistrey.getAllStudents().stream()
.filter(Objects::nonNull)
.filter(student -> !student.getAll().contains(Classes.MATH101))
.map(student -> getCustomers(student.getId())
.collect(Collectors.toList()));

我不确定你是想保留数学学生还是放弃他们。如果你想保留数学学生,从过滤器方法中删除!

这个怎么样?

public void checkCustomers() {
studentRegistry.getAllStudents().stream()
.filter(student -> !student.getAll().contains(Classes.MATH101))
.map(mathStudent -> getCustomers(mathStudent.getId()))
.forEach(this::cancelCustomers);
}

或者如果你想调用cancelCustomers()一次:

public void checkCustomers() {
cancelCustomers(studentRegistry.getAllStudents().stream()
.filter(student -> !student.getAll().contains(Classes.MATH101))
.map(mathStudent -> getCustomers(mathStudent.getId()))
.flatMap(List::stream)
.collect(Collectors.toList()));
}