我正在尝试使用Java 8 Stream API进行实验,并希望使用Java 8 stream filter map reduce转换以下方法。
我有一个电影列表,每个电影对象都有一个演员列表以及其他字段。
我想找到所有由特定名字和姓氏的演员参与的电影。
下面的方法基于Java 7,其中我循环遍历电影列表,然后循环遍历该电影的演员列表。如果找到具有该名字和姓氏的演员,则中断内部循环并将该电影添加到返回的电影列表中。
注释代码可以正常工作,我可以获得正确的电影列表。
我的问题是如何使用Java 8流重写此代码。我可以看到这是一种映射、过滤、归约的问题,但我无法想出清晰的解决方案。
我有一个电影列表,每个电影对象都有一个演员列表以及其他字段。
我想找到所有由特定名字和姓氏的演员参与的电影。
下面的方法基于Java 7,其中我循环遍历电影列表,然后循环遍历该电影的演员列表。如果找到具有该名字和姓氏的演员,则中断内部循环并将该电影添加到返回的电影列表中。
注释代码可以正常工作,我可以获得正确的电影列表。
我的问题是如何使用Java 8流重写此代码。我可以看到这是一种映射、过滤、归约的问题,但我无法想出清晰的解决方案。
public List<Movie> getMoviesForActor(String firstName, String lastName) {
final List<Movie> allMovies = movieRepository.getAllMovies();
final Predicate<Actor> firstNamePredicate = actor -> actor.getFirstName().equalsIgnoreCase(firstName);
final Predicate<Actor> lastNamePredicate = actor -> actor.getLastName().equalsIgnoreCase(lastName);
final List<Movie> movies = new ArrayList<>();
// for (Movie movie : allMovies) {
// boolean actorFound = false;
// for (Actor actor : movie.getActors()) {
// if(firstName.equalsIgnoreCase(actor.getFirstName()) && lastName.equalsIgnoreCase(actor.getLastName())) {
// actorFound = true;
// break;
// }
// }
// if(actorFound) {
// movies.add(movie);
// }
// }
final List<Actor> actors = allMovies.stream()
.flatMap(
movie -> movie.getActors().stream().filter(firstNamePredicate.and(lastNamePredicate))
).collect(Collectors.toList());
return movies;
}
如果我在电影上进行流式处理并将其平铺,然后在其中流式处理演员列表,那么如何再次获取仅包含此名字和姓氏的演员列表的电影列表?
filtering()
”收集器在多级归约中最有用,例如在“groupingBy
”或“partitioningBy
”之后使用。 - Naman