Потоки Java: flatMap возвращает поток объектов - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть этот код:

List<Application> applications = this.applicationDao.findAll();
Collection<Pair<Application, FileObject>> files = applications.stream()
    .flatMap(app -> streamOfFiles.map(file -> Pair.of(app, file)));

, где streamOfFiles является Stream<FileObject>

В настоящее время я получаю это сообщение компиляции:

Несоответствие типов: невозможно преобразовать из Stream<Object> в Collection<Pair<Application,FileObject>>

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы не можете повторно использовать streamOfFiles Поток во время итерации по applications!

Вам необходимо преобразовать streamOfFiles из Stream<FileObject> в List<FileObject>, а затем:

List<FileObject> listOfFiles = streamOfFiles.collect(Collectors.toList());
List<Application> applications = this.applicationDao.findAll();
Collection<Pair<Application, FileObject>> files =  applications.stream()
            .flatMap(app -> listOfFiles.stream().map(file -> Pair.of(app, file)))
            .collect(Collectors.toList());

Простой пример, доказывающий, что:

Stream<Integer> s = IntStream.range(0, 100).boxed();
IntStream.range(0, 100).boxed()
         .flatMap(i -> s.map(j -> i * j))
         .collect(Collectors.toList());

Выдает это исключение:

java.lang.IllegalStateException: поток уже был обработан илизакрыто

0 голосов
/ 13 февраля 2019

Как указывает ernest_k , вы, похоже, пропускаете collect там:

Collection<Pair<Application, FileObject>> files = applications.stream()
        .flatMap(app -> files.stream().map(file -> Pair.of(app, file)))
        .collect(Collectors.toList()); // any collection you want

Редактировать : с, streamOfFiles потребляется за одну flatMap операцию, вы должны вместо этого использовать <collection>.stream(), чтобы создать поток заново для каждого app.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...