Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java流进行计算_Java_Java 8_Java Stream - Fatal编程技术网

使用java流进行计算

使用java流进行计算,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个列表,想写一个基于流的代码来找到平均价格 输入参数是带有数量和价格字段的PT类列表。 输入: [PT(qty=300, price=57.8), PT(qty=200, price=57.5), PT(qty=240, price=57.2)] 输出: Price = (300 x 57.86 +200 x 57.5 + 240 x 57.28) / 740 = 57.57 PT等级: class PT{ Big

我有一个列表,想写一个基于流的代码来找到平均价格

输入参数是带有数量和价格字段的PT类列表。 输入:

[PT(qty=300, price=57.8),           
PT(qty=200, price=57.5),        
PT(qty=240, price=57.2)]       
输出:

Price = (300 x 57.86 +200 x 57.5 + 240 x 57.28) / 740 = 57.57
PT等级:

class PT{       
   BigDecimal price;      
   BigDecimal qty;  
}
我有点困惑如何编写一个函数来产生上述输出。
如果有人能提供一些线索,那将是一个很大的帮助。谢谢

因为类中有两个参数,所以不能使用经典

您可以使用循环:

List<PT> list = new ArrayList<>() {{
    add(new PT(57.8, 300));
    add(new PT(57.5, 200));
    add(new PT(57.2, 240));
}};

BigDecimal sum = BigDecimal.ZERO, product = BigDecimal.ZERO;
for (PT p : list) {
    sum = sum.add(p.getQty());
    product = product.add(p.getQty().multiply(p.getPrice()));
}
double result = product.divide(sum, RoundingMode.CEILING).doubleValue();
System.out.println(result);

如果您的值不太大,并且可以放入double max 1.7976931348623157e+308中,使用它会降低成本

您不能在单向流中手动执行此操作,因为您无法以一种方式管理产品和总金额,请使用给定的重复链接,或者usr a对于每个循环,这里有一个答案,并有详细的解释:@Naman我认为你的dupe target不足以进行OP,因为他们需要使用加权平均。转换为使用BigDecimal而不是double/long可能更容易。@azro您实际上可以使用自定义收集器在单向流中进行转换。