Я пытаюсь обойти с помощью Java 8 Stream API и хотел преобразовать следующий метод, используя уменьшение фильтра потока Java 8.
У меня есть список фильмов, и у каждого объекта Movie есть список актеров.с другими полями.
Я хочу найти все фильмы, в которых работал актер с определенным именем и фамилией.
Метод, представленный ниже, основан на 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;
}
Если я посмотрю фильмы и раскрою их, а в них список актеров.Как я могу получить список фильмов снова, где существует только этот актер с именем и фамилией?