将Stream <Stream <T >>转换为List <T>

时间:2019-06-10 07:39:05

标签: java lambda java-8 java-stream

我是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 个答案:

答案 0 :(得分:7)

使用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());

答案 1 :(得分:0)

为什么要获得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);

答案 2 :(得分:0)

要在单独的步骤中查看它以提高可读性,我们可以相应地编写它:

        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>>
  • 使用流式方法简化列表以键入Stream<DeliveryDocumentLine>
  • 在最后一步中,映射到期望的类型并收集到期望的集合。