2017-01-18 2 views
5

Я пытаюсь получить список из потока, но у меня есть исключение.java: несовместимые типы: переменная вывода T имеет несовместимые ограничения ограничений равенства: нижние границы: java.util.List <>

Здесь находится объект Movie со списком объекта.

public class Movie { 

    private String example; 
    private List<MovieTrans> movieTranses; 

    public Movie(String example, List<MovieTrans> movieTranses){ 
     this.example = example; 
     this.movieTranses = movieTranses; 
    } 
    getter and setter 

Вот это MovieTrans:

public class MovieTrans { 

    public String text; 

    public MovieTrans(String text){ 
     this.text = text; 
    } 
    getter and setter 

я добавить элемент в списках:

List<MovieTrans> movieTransList = Arrays.asList(new MovieTrans("Appel me"), new MovieTrans("je t'appel")); 
List<Movie> movies = Arrays.asList(new Movie("movie played", movieTransList)); 
//return a list of MovieTrans 
List<MovieTrans> movieTransList1 = movies.stream().map(Movie::getMovieTranses).collect(Collectors.toList()); 

У меня есть эта ошибка компилятора:

Error:(44, 95) java: incompatible types: inference variable T has incompatible bounds 
    equality constraints: MovieTrans 
    lower bounds: java.util.List<MovieTrans> 

ответ

10

map вызова в

movies.stream().map(Movie::getMovieTranses) 

преобразует Stream<Movie> в Stream<List<MovieTrans>>, которые вы можете собрать в List<List<MovieTrans>>, а не List<MovieTrans>.

Чтобы получить один List<MovieTrans>, используйте flatMap:

List<MovieTrans> movieTransList1 = 
    movies.stream() 
      .flatMap(m -> m.getMovieTranses().stream()) 
      .collect(Collectors.toList()); 
8

Тип вашего выражения List<List<MovieTrans>>: это конкатенация результатов метода getMovieTranses.

Используйте flatMap вместо того, чтобы:

List<MovieTrans> movieTransList1 = movies.stream() 
    .flatMap(m -> m.getMovieTranses().stream()) 
    .collect(Collectors.toList()); 
+0

не представляется возможным, чтобы вызвать ссылку метод в качестве параметра в flatMap. Я делаю это с m -> m.getMovieTranses(). stream() – emoleumassi

+2

@emoleumassi отредактирован. –

Смежные вопросы