我正在编写一个程序,我必须在该程序中获得火车的平均延迟,但是我遇到了麻烦,因为流必须返回一个int(这意味着它将接近该值)。我宁愿不要使用垂头丧气。 以下是代码示例
public int getAvgDelay(){
return trainStop.stream()
.flatMapToInt(a->a.getDelays().stream())
.average().orElse(-1);
}
getDelays()返回一个整数列表,其中包含该列车在单个站点中的延迟,我将其转换为流,然后平均值将返回双精度值,但是我想找到一种方法来获取一个整数它。
总的来说,我遇到了大多数流的麻烦,在使用一些汇总收集器之后,我不得不返回单个值,如果您能给我关于如何做的一般规则,我将不胜感激!
答案 0 :(得分:3)
average
方法的结果为double
(实际上是OptionalDouble
,但这不是重点)。如果要从方法中返回integer
,则必须将结果显式转换为int
。发生这种情况是因为double存储在64位,而整数存储在32位。因此,您必须明确地进行从double
到int
的转换-因为您同意您将失去一些准确性。
您可能有兴趣使用Math::ceil
,Math::floor
或Math::round
之类的方法来取平均值。这些方法也返回double
(Math::round
也返回long
),因此您也必须显式应用强制类型转换。但是,这些方法将四舍五入到最接近的整数-但仍然是double
类型。
答案 1 :(得分:1)
这是使用Math.round()
舍入平均值并将其转换为int
的一种方法:
public int getAvgDelay() {
return trainStop.stream()
.flatMapToInt(a -> a.getDelays().stream())
.average().stream()
.mapToLong(Math::round).mapToInt(i -> (int) i)
.findFirst().orElse(-1);
}
但是您应该考虑返回Optional而不是幻数(-1
)。如果这样做,还可以返回OptionalDouble
,或者如果您想要一个整数,则直接返回OptionalLong
以防止强制转换为int
。
然后您可以像这样调用方法:
int avg = getAvgDelay().orElse(-1);
或者如果需要错误状态,请使用.orElseThrow()
。