最初と最後の名前を持つ俳優はストリーム、マップ、フィルタ、削減のJava 8を使用して働いている作品を探します

カシーフ:

私は、Java 8のストリームAPIでplayaroundしようと削減の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;
}

私は映画にストリーミングし、それをflatmap、それは俳優のリストをストリームにした場合のみ最初と最後の名前を持つこの俳優が存在する場合、どのように私は再び映画のリストを得ることができますか?

ラビンドラRanwala:

反復可能にわたってループし、容易に使用して達成することができるが見出されると破壊しつつ、第1の整合要素を見つけるanyMatchJava8における短絡端末動作を制御します。その後の結果合格anyMatchfilter与えられた条件に一致するすべてのムービーを取得するためにオペレータを。

あなたはどこか別の場所にそれらを再利用しない限り、私はむしろあなたがインライン述語を使用しての代わりに、それらを別々に定義することをお勧め。それほど冗長であることがより凝縮されたコードにこのリード。ここではそれがどのように見えるのです。

movies.stream()
    .filter(m -> m.getActors().stream()
        .anyMatch(
            a -> a.getFirstName().equalsIgnoreCase(firstName) 
                && a.getLastName().equalsIgnoreCase(lastName)))
    .collect(Collectors.toList());

あなたは本当にあなたの問題文で与えられるように事前定義された述語を使用する必要がある場合は何らかの理由であなたがそうのようにそれを行うことができ、

movies.stream()
    .filter(m -> m.getActors().stream()
        .anyMatch(firstNamePredicate.and(lastNamePredicate)))
    .collect(Collectors.toList());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=172426&siteId=1