【问题标题】:Java 8 Collectors.averagingLong trying to cast Double to long?Java 8 Collectors.averagingLong 试图将 Double 转换为 long?
【发布时间】:2016-01-30 09:06:13
【问题描述】:

我有像下面这样的函数,它应该计算共享某个指定名称的所有文件的平均 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 后,这个double 是从哪里来的?

来自lastModified的javadoc:

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

【问题讨论】:

  • long 数的平均值不一定是 long (以 1 和 2 为例)...averagingLong returns a double
  • 那么同时拥有averagingLong 和averagingDouble 有什么意义呢?我希望 long 变量会丢弃小数点 O_O
  • 一个平均多头,另一个平均加倍(作为数据源),但都返回双倍。如果您不需要小数部分,您可以将该 double 转换为 long...
  • 感谢您的澄清。我仍然认为这个名称具有误导性。

标签: java


【解决方案1】:

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

确切地说,averagingLong 的签名是:

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

该方法返回一个Collector&lt;T,?,Double&gt;。这被插入到具有签名的收集函数中。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 2021-12-03
    • 1970-01-01
    • 2019-07-31
    • 2013-01-20
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多