我是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>
来自此右手表达式。无法理解如何将此流流转换为列表。
答案 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());
它的作用:
Stream<List<DeliveryDocumentLine>>
Stream<DeliveryDocumentLine>