Преобразование потокак списку <T> - PullRequest
3 голосов
/ 10 июня 2019

Я новичок в Java 8. Я написал следующий фрагмент кода:

Stream<Stream<POLine>> list = poSearchResponseList.stream().map(poSearchResponse ->
        poSearchResponse.getDeliveryDocumentLines().stream().map(deliveryDocumentLine ->
                POLine.builder()
                        .poLineNumber(deliveryDocumentLine.getPurchaseReferenceLineNumber())
                        .quantity(deliveryDocumentLine.getExpectedQty())
                        .vnpkQty(deliveryDocumentLine.getVnpkQty())
                        .build()));

Я хочу получить

List<POList>

из этого выражения правой руки.Не могу понять, как преобразовать этот поток потока в список.

Ответы [ 3 ]

7 голосов
/ 10 июня 2019

Используя flatMap, легко преобразовать Stream<Stream<POLine>> в Stream<POLine>:

List<POLine> output = 
    list.flatMap(Function.identity())
        .collect(Collectors.toList());

Хотя может быть проще создать List<POLine> напрямую:

List<POLine> list = 
    poSearchResponseList.stream()
                        .flatMap(posr -> posr.getDeliveryDocumentLines()
                                             .stream()
                                             .map(dl -> 
                                                 POLine.builder()
                                                       .poLineNumber(dl.getPurchaseReferenceLineNumber())
                                                       .quantity(deliveryDocumentLine.getExpectedQty())
                                                       .vnpkQty(deliveryDocumentLine.getVnpkQty())
                                                       .build()))
                        .collect(Collectors.toList());
0 голосов
/ 10 июня 2019

Чтобы увидеть его в отдельных шагах для лучшей читабельности, мы можем написать его соответствующим образом:

        List<POLine> list =
                poSearchResponseList.stream()
                        .map(POLine::getDeliveryDocumentLines)
                        .flatMap(Stream::of)
                        .map(dl ->
                                POLine.builder()
                                        .poLineNumber(dl.getPurchaseReferenceLineNumber())
                                        .quantity(deliveryDocumentLine.getExpectedQty())
                                        .vnpkQty(deliveryDocumentLine.getVnpkQty())
                                        .build())
                        .collect(Collectors.toList());

Что он делает:

  • Создает поток из poSearchResponseList,
  • затем отображает элементы на deliveryDocumentLines, возвращая: Stream<List<DeliveryDocumentLine>>
  • редукция List с помощью метода stream для ввода Stream<DeliveryDocumentLine>
  • в последнем шаге отображение на ожидаемый тип и сбор на ожидаемый сбор.
0 голосов
/ 10 июня 2019

Почему вы хотите получить Stream<Stream<POLine>> list ??У вас уже есть список POLine из экземпляра poSearchResponseList.

Итак, я думаю, что у вас есть List<SearchResponse> с List<DeliveryDocumentLine>, и из этого вы хотите получить List<POList>,да?

Если в этом сценарии вы можете использовать метод Stream.flatMap().

Почему?

Ну, это потому, что этот метод может производить что-то вроде этого Stream<SearchResponse> -> Stream<POList>

Теперь, сначала вы извлекаете SearchResponse с использованием .stream(), затем вы выравниваете его с помощью Stream.flatMap(), тогда здесь у вас будет объект SearchResponse из этого объекта, вы можете извлечь данные из строк, как это:

List<POLine> list = poSearchResponseList
        .stream()
        .flatMap(response -> response.getDeliveryDocumentLines()
                .stream()
                .map(item -> POLine.builder()
                        .poLineNumber(item.getPurchaseReferenceLineNumber())
                        .quantity(item.getExpectedQty())
                        .vnpkQty(item.getVnpkQty())
                        .build()
                )
        )
        .collect(Collectors.toList());
System.out.println(list);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...