Потоки Java, группирующие столбец и извлекающие несколько агрегированных значений - PullRequest
0 голосов
/ 24 сентября 2018

Если у меня есть список объектов, скажем, продукты, которые должны быть сгруппированы по типу продукта.И мне нужны агрегированные цена и количество.

{{name:a1,type:normal,price:23,quantity:4}, 
{name:a2,type:normal,price:3,quantity:3},
{name:a3,type:luxury,price:233,quantity:1},
{name:a4,type:luxury,price:123,quantity:2}}

Мне нужен результирующий список, который выглядит следующим образом:

{{type:normal,price:26,quantity:7},{type:luxury,price:356,quantity:3}}

Есть ли способ добиться этого, используяпотоки Java ??

1 Ответ

0 голосов
/ 24 сентября 2018

Как насчет этого,

Map<String, Product> result = products.stream()
    .collect(Collectors.groupingBy(Product::getType,
        Collectors.reducing(new Product(null, null, 0, 0), (p1, p2) -> new Product(null, p1.getType(),
            p1.getPrice() + p2.getPrice(), p1.getQuantity() + p2.getQuantity()))));

, где Product класс должен выглядеть примерно так:

public class Product {
    private String name;
    private String type;
    private double price;
    private int quantity;

    public Product(String name, String type, double price, int quantity) {
        super();
        this.name = name;
        this.type = type;
        this.price = price;
        this.quantity = quantity;
    }
    // ...
}
...