Умножить элементы в потоке - PullRequest
2 голосов
/ 07 июня 2019

Возможно ли с помощью Java stream 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 ]

6 голосов
/ 07 июня 2019

Вы можете использовать flatMap с Collections.nCopies как:

public static List<String> products(List<OrderRow> orderRows) {
    return orderRows.stream()
            .flatMap(o -> Collections.nCopies(o.quantity, o.productCode).stream())
            .collect(Collectors.toList());
}
0 голосов
/ 07 июня 2019

Вам необходимо использовать 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...