在流中相乘项

时间:2019-06-07 07:52:29

标签: java java-stream

Java流API是否可以重复复制几次项目?

例如,假设我们有一个订单列表,其中每个订单都有产品代码和数量。我想获取一个包含n个给定代码副本的产品代码列表,其中n是数量。

当我有2个订单("product1" : 3x, "product2": 2x)时,我希望得到这样的列表:("product1", "product1", "product1", "product2", "product2")

在没有旧的for循环的情况下,是否有一种漂亮的方法可以做到这一点?

代码如下:

@Data
public class OrderRow {
   private String productCode;

   private int quantity;
}

2 个答案:

答案 0 :(得分:6)

您可以将flatMapCollections.nCopies一起使用:

public static List<String> products(List<OrderRow> orderRows) {
    return orderRows.stream()
            .flatMap(o -> Collections.nCopies(o.quantity, o.productCode).stream())
            .collect(Collectors.toList());
}

答案 1 :(得分:0)

您需要使用Stream.flatMap()并使用每一行的项目创建一个新流:

List<String> result = orderRows.stream()
        .flatMap(row -> Stream.generate(row::getProductCode).limit(row.getQuantity()))
        .collect(Collectors.toList());

您也可以使用此:

List<String> result = orderRows.stream()
        .flatMap(row -> IntStream.range(0, row.getQuantity()).mapToObj(i -> row.getProductCode()))
        .collect(Collectors.toList());