Список списков и Java 8 - PullRequest
       6

Список списков и Java 8

0 голосов
/ 02 октября 2018

У меня есть список класса R со списком другого класса P

List<R> rList = getRListFromDb();

Я хотел бы получить все объекты P в другом списке

List<P> result = new ArrayList<>();

Я пробовал эти, но давая мне исключение приведения класса, говоря, что класс P не может быть преобразован в класс R. По тому, как я видел проблему, приведенную ниже, но пытался и не мог ее выяснить.

Как мне обратитьсяСписок списков в список в Java 8?

1. rList.stream().map(R::getP).flatMap(List::stream).forEach(result::addAll);
2. rList.forEach(r -> result.addAll(r.getP()));

Я хотел бы узнать, что здесь не так, а также хотел бы узнать различные способы сделать это в Java 8.

1 Ответ

0 голосов
/ 02 октября 2018
rList.stream().map(R::getP).flatMap(List::stream).forEach(result::addAll);

будет работать, если вы не используете flatMap (поскольку addAll требует Collection, но flatMap преобразует ваш Stream<List<P>> в Stream<P>.

Этобудет работать:

rList.stream().map(R::getP).forEach(result::addAll);

С flatMap должно быть:

rList.stream().map(R::getP).flatMap(List::stream).forEach(result::add);

Тем не менее, правильный способ - использовать collect:

List<P> result = rList.stream()
                      .map(R::getP)
                      .flatMap(List::stream)
                      .collect(Collectors.toList());

или

List<P> result = rList.stream()
                      .flatMap(r -> r.getP().stream())
                      .collect(Collectors.toList());
...