Как получить сумму двойников в списке, используя поток? - PullRequest
1 голос
/ 06 января 2020

Программа о закупках компаний. И мне нужно получить определенные данные c от них, используя лямбды и потоки.

КОМПАНИЯ

@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 к сожалению Основной класс слишком велик, но он состоит в основном из созданных объектов: продукты, компании и покупки. Со списком всех компаний внизу.

Как вернуть компанию, которая потратила больше всего денег на покупки? Я пробовал что-то вроде этого:

 // 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()))
    }

Ответы [ 5 ]

3 голосов
/ 06 января 2020

Вы можете использовать mapToDouble, затем завершить методом sum(). Как то так:

double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
1 голос
/ 06 января 2020

Вы можете использовать функцию группировки :

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) отвечает за суммирование всех цен.

0 голосов
/ 06 января 2020

Вы можете использовать это для получения значений list из Double.

 List<Double> doubleList= values.stream().map(vals-> 
          vals.stream().mapToDouble(Double::doubleVal).sum()
          .collect(Collectors.toList());
0 голосов
/ 06 января 2020
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();
0 голосов
/ 06 января 2020

Если вам нужна компания, потратившая максимальную сумму, то вам нужно иметь 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

...