Encontrar películas donde un actor con nombre y apellido ha trabajado con Java 8 arroyos, mapa, filtro, reducir

Kashif:

Estoy tratando de playaround con Java 8 Corriente del API y quería convertir el siguiente método usando Java 8 mapa de flujo de filtro de reducir.

Tengo una lista de películas y todos los objetos de la película tiene una lista de actores junto con otros campos.

Quiero encontrar todas las películas en las que el actor con un determinado nombre y apellido ha trabajado en ella.

El siguiente método es Java 7 basado en el que un bucle sobre la lista de películas y luego bucle sobre una lista de actores para la película. Si se determina que un actor con ese nombre y apellido, rompo el bucle interior y añadir esa película a la lista de películas que se devuelve.

El código comentado funciona y que puede obtener la lista derecha de Películas.

Mi pregunta es ¿cómo puedo volver a escribir el código usando Java 8 corrientes. Puedo ver que es un mapa, filtro, reducir el problema, pero no soy capaz de llegar a una solución clara.

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

Si ciclo sobre cine y flatmap ella y en ella lista de actores Stream, ¿cómo puedo obtener la lista de las películas de nuevo donde sólo existe este actor con nombre y apellido?

Ravindra Ranwala:

Encontrar el primero elemento de adaptación, mientras que un bucle a través de una iterable y romper una vez que se encontró se puede conseguir fácilmente mediante el anyMatchfuncionamiento del terminal de cortocircuito en Java8. A continuación, pasar el resultado de anyMatchque el filteroperador para obtener todas las películas con las características indicadas.

Prefiero que sugeriría el uso de predicados en línea en lugar de definir por separado a menos que les reutilizar en otro lugar. Esto conduce a un código más condensada que es menos detallado. Así es como se ve.

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

Por alguna razón, si realmente necesita usar los predicados predefinidos como se indica en su enunciado del problema que puede hacerlo como tal,

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=172429&siteId=1
Recomendado
Clasificación