[英]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();
您可以使用java-stream的分組功能:
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.