Java Stream: квартира из парыв пару - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно преобразовать поток Pair<Application, FileObject[]> в поток Pair<Application, FileObject>.

В настоящее время я закодировал следующее:

List<Application> applications = this.applicationDao.findAll();
applications.stream()
    .map(app -> 
        new Pair<Application, FileObject[]>(
            app,
            this.massiveInterfaceService.getPendingDocuments(app)
        )
    );

Итак, что мне нужноэто получить поток Pair<app, FileObject>.

this.massiveInterfaceService.getPendingDocuments это:

public Stream<FileObject> getPendingDocuments(Application app) { /*...*/ }

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете просто позвонить flatMap, создав поток с результатом getPendingDocuments.Это потому, что getPendingDocuments уже возвращает поток.

applications.stream()
   .flatMap(app -> this.massiveInterfaceService
                    .getPendingDocuments(app)
                    .map(doc -> Pair.of(app, doc));
0 голосов
/ 20 ноября 2018

Предполагая, что massiveInterfaceService.getPendingDocuments() возвращает FileObject[], вы можете создать метод, подобный этому:

Stream<Pair<Application, FileObject>> flatten(Pair<Application, FileObject[]> pair) {
   return Arrays.stream(pair.getRight())
                .map(fileObject -> new Pair.of(pair.getLeft(), fileObject));
}

Затем используйте его в своем потоке:

Stream<Pair<Application, FileObject>> stream =
   applications.stream()
        .map(app -> 
            Pair.of(app, this.massiveInterfaceService.getPendingDocuments(app)))
        .flatMap(this::flatten);

Если на другомрука massiveInterfaceService.getPendingDocuments() возвращает Stream<FileObject>

Stream<Pair<Application, FileObject>> stream =
   applications.stream()
        .flatMap(app -> 
            this.massiveInterfaceService
                .getPendingDocuments(app)))
                .map(fileObject -> Pair.of(app, fileObject)));

Из вашего вопроса не ясно, какой является правильным.

...