如何获取特定国家的产品总和

How to get the sum of prodcuts from a specific country

我希望获得来自比利时的所有产品的总和。 显然我从 lsit 得到所有产品的总和。 我用这个 sum = productsList.stream().mapToInt(Products::getPrice).sum(); 来计算我的比利时产品总和,但我看到这个代码正在取出所有产品的总和
somoane 可以向我解释我的代码中做错了什么吗? 我有一个 class 产品,这是我的主要产品:

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class sumProdBelgium {
    public static void main(String[] args) {
        Products product1 = new Products("ham", LocalDate.of(2020, 10, 15), "belgium", 3);
        Products product2 = new Products("bacon", LocalDate.of(2021, 1, 17), "RPA", 4);
        Products product3 = new Products("bread", LocalDate.of(2022, 2, 2), "Poland", 1);
        Products product4 = new Products("cheese", LocalDate.of(2023, 1, 19), "RPA", 5);
        Products product5 = new Products("tomato", LocalDate.of(2019, 12, 2), "belgium", 1);

        List<Products> productsList = new ArrayList<>(List.of(product1, product2, product3, product4, product5));


        int sumBelgiumIteration = getSumbelgiumIteration(productsList);
        System.out.println("Sum product belgium iteration is : " + sumBelgiumIteration + " euro");
    }


    public static int getSumbelgiumIteration(List<Products> productsList) {
        int sum = 0;
        //iterate trough list 
        for (Iterator<Products> iterator = productsList.iterator(); iterator.hasNext(); ) {
            //if contain "belgium"
            if (iterator.next().getCountry().equalsIgnoreCase("belgium")) {
//  sum  is = to  belgium product (is not this the way  of taking the products from "belgium")
                sum = productsList.stream().mapToInt(Products::getPrice).sum();
            }
        }
        return sum;
    }
}

预期输出 = 4

我得到的输出是14(所有产品的总和)

在行

sum = productsList.stream().mapToInt(Products::getPrice).sum();

您正在将所有产品的总和放入 var 总和中。尝试将其更改为

sum += iterator.next().getPrice();
sum = productsList.stream().mapToInt(Products::getPrice).sum();

这会获取所有产品,遍历它们并将它们映射到一个整数,然后求和。 很明显,您想过滤并获取所有“比利时”元素。

这很容易通过 .filter() 实现。

int sumOfBelgiumElements = productsList.stream()
        .filter(product-> product.getCountry().equalsIgnoreCase("belgium")) // Get only the elements that have Belgium as country
        .mapToInt(Products::getPrice) // Map
        .sum(); // sum

这总结了您在您的方法中尝试做的事情。所以你可以用这个替换你的代码。

另一件需要注意的事情是,每次迭代都会覆盖 sum 的值。那不会导致你需要什么。