如何在Set中返回一个不同的对象并总结一个公共值?

时间:2016-12-09 16:09:49

标签: java java-8 java-stream

例如:我有一个包含两个或更多Product实例对象的Set("它们具有不同的金额值")

public class Product{

private int id;
private String name;
private String brand;
private Long amount;

// getter and setters
}

可以使用Stream来获取单个对象并对金额值求和吗?

2 个答案:

答案 0 :(得分:2)

yourSet.stream().mapToInt(Product::getAmount).sum()

会为您提供金额总和,您可以创建一个Product对象,将金额设置为此总和。

答案 1 :(得分:1)

假设您有一个Set<Product>,其中每个产品具有相同的ID,名称和品牌但数量不同。我们可以轻松地创建一个新的Product,但使用一个Stream这样做是多余的(我们可能会使用reduce,但可能会有更多的开销,而不仅仅是执行以下操作)。相反,让我们为您的问题创建一个空置安全的解决方案:

public Product getTotalAsProduct(Set<Product> set) {
    Product newProduct = null;
    Optional<Product> findProduct = set.stream().findFirst();
    if(findProduct.isPresent()) { //No sense in making an object if set is empty
        //Create a new Product with the same id, name, brand
        newProduct = findProduct.get().clone(); //If Cloneable, OR create a constructor that takes a Product and makes a new one, OR make a new Product() and get/set as needed
        long totalAmount = set.stream().mapToInt(Product::getAmount).sum();
        newProduct.setAmount(totalAmount);
    }
    return newProduct; //Null if set was empty
}