簡體   English   中英

如何使用流獲取列表中的雙打總和?

[英]How to get sum of doubles in list using stream?

計划是關於購買公司的。 我需要使用 lambdas 和流從他們那里獲取一些特定數據。

公司

@AllArgsConstructor
public class Company {
    private String name; // nazwa firmy
    private String cityHeadquarters; // siedziba firmy
    private int employees; // ilość pracowników
    private List<Purchase> purchaseList; // lista zakupów wykonanych przez firmę (co firma kupiła)


}

產品


@Data
@AllArgsConstructor
public class Product {
    private String name; // nazwa produktu
    private double price; // cena produktu

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Product)) return false;
        Product product = (Product) o;
        return Double.compare(product.price, price) == 0 &&
                Objects.equals(name, product.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, price);
    }
}

購買

@Data
@AllArgsConstructor
public class Purchase {             // klasa reprezentuje zakup
    private Product product;        // produkt zakupiony
    private LocalDate purchaseDate; // data dokonania zakupu
    private double quantity;        // zakupiona ilość produktu
    private UNIT unit;              // jednostka zakupu (np. w gramach)

}

MAIN不幸的是Main類太大了,但它主要由創建的對象組成:產品、公司和采購。 在底部列出所有公司。

如何回報在采購上花費最多的公司? 我試過這樣的事情:

 // 11. Zwróć firmę która dokonała zakupów na największą kwotę
    private static Company zad11(List<Company> companies) {
        List<Company> list1 = companies.stream()
        .map(c -> c+ c.getPurchaseList().stream()
        .filter(p -> p.getQuantity()*p.getProduct().getPrice()))
    }

您可以使用mapToDouble然后以sum()方法終止。 像這樣的東西:

double sum = vals.stream().mapToDouble(Double::doubleValue).sum();

您可以使用的分組功能:

Map<Company, Double> map = companies.stream().collect(
    Collectors.groupingBy(                                 // To Map<Company, Double>
        Function.identity(),                               // Key: Company
        Collectors.summingDouble(c -> c.getPurchaseList()  // Value: Sum of all purchases
            .stream()
            .mapToDouble(p -> p.getProduct().getPrice())   // ... of all products and its prices
            .sum()                                         // ... as sum
        )   
    )
);

關鍵是每個Company ,地圖的價值是其購買的所有產品的價格總和 - 這保證了Collectors::groupingBy(Function, Collector)

下游收集器Collectors::summingDouble(ToDoubleFunction)負責Collectors::summingDouble(ToDoubleFunction)所有價格。

如果你需要花費最大金額的公司,那么你需要有 max()

    Stream<Double> doubleStream = companies.stream().map(s -> s.getPurchaseList()).flatMap(k -> k.stream().map(j -> j.getProduct().getPrice()));
    List<Double> collect = doubleStream.mapToDouble(k -> k).boxed().collect(Collectors.toList());
    Optional<Double> max = collect.stream().max(Double::compareTo);
    System.out.println(max.get());

輸出:

90000.0

我創建的 GIST: https : //gist.github.com/vishwaratna/47952c81976ade500231757662d8c5cc

Add new property in Company class as below

private double pruchseTotal;

companies.stream().forEach(c->c.setPruchseTotal( c.getPurchaseList().stream().collect(Collectors.summingDouble(p->p.getProduct().getPrice()*p.getQuantity())) ));
Company company = companies.stream().collect(Collectors.maxBy(Comparator.comparingDouble(Company::getPruchseTotal))).get();

您可以使用它來獲取Double值的list

 List<Double> doubleList= values.stream().map(vals-> 
          vals.stream().mapToDouble(Double::doubleVal).sum()
          .collect(Collectors.toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM