Java 8 Collectors.averagingLong试图将Double转换为long?

时间:2016-01-30 09:06:14

标签: java

我有像bellow这样的函数,应该计算共享某些指定名称的所有文件的平均lastModified(它们位于不同的目录中)。

private static long getAverageTimestamp(List<File> files, String filter) {

    return files.stream()
                .filter(f -> f.getName().equals(filter))
                .collect(Collectors.averagingLong(File::lastModified));

}

问题是Collectors.averagingLong抱怨它无法将Double投射到long

File::lastModified返回long以来,此双重来自何处?

来自lastModified的javadoc:

  

返回:一个值,表示文件上次修改的时间,以纪元(格林威治标准时间00:00:00,1970年1月1日)为单位,以毫秒为单位测量......

1 个答案:

答案 0 :(得分:2)

getAverageTimestamp的返回类型很长。然而,流操作的返回类型是双倍的,因为averagingLong收集到双倍。因此,您会收到有关无法从double转换为long的错误。请参阅Java 8 Documentation on Collectors

确切地说,averagingLong的签名是:

<T> Collector<T,?,Double> averagingLong(ToLongFunction<? super T> mapper)

该方法返回Collector<T,?,Double>。这将插入具有签名的collect函数。

<R,A> R collect(Collector<? super T,A,R> collector)

在此签名中,R是collect调用的泛型返回类型,并且与collectors类型的第三个参数匹配。这是averagingLong返回的收集器的双精度因此collect的返回类型变为double。