Java流如何将具有数量的对象解压缩到单个对象列表

ale*_*z78 5 java java-stream

我有一个“项目”对象列表,如:

public class Item {
    private String name;
    private int qty;

    public Item() { }

    public Item(String name, int qty) {
        this.name = name;
        this.qty = qty;
    }

    public List<Item> unpack() {
        List<Item> items = new ArrayList<>();
        items.add(new Item("foo", 2));
        items.add(new Item("bar", 3));
        items.add(new Item("baz", 1));

        List<Item> unpackedItems = unpack(items);
        System.out.println(unpackedItems.size()); // it should be == 6
        return unpackedItems;
    }

    private List<Item> unpack(List<Item> items) {
        // ..
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用流“解包”这些对象,以便在数量大于 1 时最终重复项目列表,因此最后我将拥有数量等于 1 的对象?

ern*_*t_k 10

您可以基于以下内容展平嵌套流qty(这基本上创建了一个qty大小为 int 的流,然后将其映射到Item具有qty = 1每个元素的新流,重用名称):

private List<Item> unpack(List<Item> items) {
    return items.stream()
            .flatMap(item -> IntStream.range(0, item.qty)
                               .mapToObj(i -> new Item(item.name, 1)))
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)