我有像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日)为单位,以毫秒为单位测量......
答案 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。