如何从int流中获取int类型的平均值?

时间:2019-06-30 17:16:36

标签: java java-stream

我正在编写一个程序,我必须在该程序中获得火车的平均延迟,但是我遇到了麻烦,因为流必须返回一个int(这意味着它将接近该值)。我宁愿不要使用垂头丧气。 以下是代码示例

public int getAvgDelay(){
  return trainStop.stream()
                  .flatMapToInt(a->a.getDelays().stream())
                  .average().orElse(-1);
}

getDelays()返回一个整数列表,其中包含该列车在单个站点中的延迟,我将其转换为流,然后平均值将返回双精度值,但是我想找到一种方法来获取一个整数它。

总的来说,我遇到了大多数流的麻烦,在使用一些汇总收集器之后,我不得不返回单个值,如果您能给我关于如何做的一般规则,我将不胜感激!

2 个答案:

答案 0 :(得分:3)

average方法的结果为double(实际上是OptionalDouble,但这不是重点)。如果要从方法中返回integer,则必须将结果显式转换为int。发生这种情况是因为double存储在64位,而整数存储在32位。因此,您必须明确地进行从doubleint的转换-因为您同意您将失去一些准确性。

您可能有兴趣使用Math::ceilMath::floorMath::round之类的方法来取平均值。这些方法也返回doubleMath::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()