gpt4 book ai didi

java - 使用 Java 8 Streams、map、filter、reduce 查找具有名字和姓氏的 Actor 曾工作过的电影

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:34 25 4
gpt4 key购买 nike

我正在尝试使用 Java 8 Stream API 并希望使用 Java 8 流过滤器 map reduce 转换以下方法。

我有一个电影列表,每个电影对象都有一个 Actor 列表以及其他字段。

我想找到具有特定名字和姓氏的 Actor 曾在其中工作的所有电影。

下面的方法是基于 Java 7 的,我在其中循环遍历电影列表,然后循环遍历该电影的 Actor 列表。如果找到具有该名字和姓氏的 Actor ,我将中断内部循环并将该电影添加到返回的电影列表中。

注释代码有效,我可以获得正确的电影列表。

我的问题是如何使用 Java 8 流重写这段代码。我可以看到这是一个 map 、过滤器、减少问题,但我无法想出一个明确的解决方案。

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;
}

如果我在电影上流式传输并将其平面化并在其中流式传输 Actor 列表,我如何才能再次获得电影列表,其中只有这个 Actor 的名字和姓氏存在?

最佳答案

由于其他答案已经解决了您可以在 java-8 中解决问题的方法,因此通过此解决方案,您可以使用全新的 Collectors.filteringjava-9 中引入。所以就把它留在这里以供将来引用。

List<Movie> movies = allMovies.stream()
.collect(Collectors.filtering(
m -> m.getActors().stream().anyMatch(firstNamePredicate.and(lastNamePredicate)),
Collectors.toList()));

关于java - 使用 Java 8 Streams、map、filter、reduce 查找具有名字和姓氏的 Actor 曾工作过的电影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54586256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com